找回密码
 加入
搜索
查看: 8474|回复: 6

[AU3基础] XML xmlns讀取的疑問

  [复制链接]
发表于 2014-8-1 06:50:44 | 显示全部楼层 |阅读模式
以下是XML的內容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<app xmlns="app">
        <setting xmlns="setting">
                <appsetting xmlns="app">
                        <play>
                                <prerollDuration>3</prerollDuration>
                        </play>
                </appsetting>
        </setting>
</app>
我的語法
#include <Array.au3>
#include <_XMLDomWrapper.au3>
$xml="Setting.xml"

If FileExists($xml) Then
_XMLFileOpen($XML) 
$t0 = _XMLGetValue("/app/setting/appsetting/play/prerollDuration")
For $k = 1 To UBound($t0) - 1
        MsgBox(0, 0, $t0[$k])
        Next
EndIf
如果把XML的xmlns值拿掉~是可以讀到prerollDuration
但是多了xmlns~就讀不到prerollDuration
我該如何讀prerollDuration的值呢?
发表于 2014-8-1 07:49:10 | 显示全部楼层
XML的 xmlns属性的参考 :传 送 门


[quote]注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。[/quote]


au3的解决办法只能先删除它的了
发表于 2014-8-1 16:37:50 | 显示全部楼层
本帖最后由 shqf 于 2014-8-1 16:45 编辑

楼主,可参照http://www.autoitx.com/forum.php ... 1&highlight=xml
不过你的xml文档好像不够规范。你在XML文档的开头部分给app元素声明了一个默认的命名空间,后面又把其他元素声明了默认的命名空间,冲突了。把后面的改一下。用命名空间主要为了把不同文档中相同名称的根节点进行区别。之后的节点元素如一定要用命名空间,不要用默认的,最好加上命名空间的名称。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<app xmlns="app">
        <setting xmlns:aa="setting">
                <appsetting xmlns:bb="app">
                        <play>
                                <prerollDuration>3</prerollDuration>
                        </play>
                </appsetting>
        </setting>
</app>
,针对根节点默认的命名空间,_XMLFileOpen()中必须补上命名空间的名称,且在之后中的每个节点名前加上这个名称作为前缀,如不是默认的命名空间,则无需加上。
#include <Array.au3>
#include <_XMLDomWrapper.au3>
$xml = "Setting.xml"
$result = _XMLFileOpen($xml,'xmlns:ns="app"')
If $result = 0 Then Exit
;$Path="/app/setting/appsetting/play/prerollDuration"
$Path="/ns:app/ns:setting/ns:appsetting/ns:play/ns:prerollDuration"
$t0 = _XMLGetValue($result, $Path)
If IsArray($t0) Then
        For $k = 1 To UBound($t0) - 1
                MsgBox(0, 0, $t0[$k])
        Next
Else
        MsgBox(0, "", "")
EndIf
我的_XMLDomWrapper.au3中的$_XMLUDFVER = "1.0.3.98",(注意库函数部分内容要修改过)。
 楼主| 发表于 2014-8-5 04:20:00 | 显示全部楼层
回复 3# shqf

謝謝大大的回復
只是那個XML是程式自動給的~
小弟只是想透過AutoIt去讀取某一個值
所以無法在節點加上名稱
還有...app的命名是小弟的範例~原來的XML是沒衝突的
只是結構都一樣~如果是這樣~還有辦法讀取嗎??
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<system xmlns="http://www.xxxx.com/ns/system">
        <setting xmlns="http://www.xxxx.com/ns/setting">
                <appsetting xmlns="http://www.xxxx.com/ns/app">
                        <play>
                                <prerollDuration>3</prerollDuration>
                        </play>
                </appsetting>
        </setting>
</system>
发表于 2014-8-5 15:51:03 | 显示全部楼层
本帖最后由 shqf 于 2014-8-5 15:52 编辑

如果xml原文件内容如上所列,仍都用默认命名空间,则我认为那个程式给出的还是不规范,我没有其他好办法了。要不先用一句正则把xmlns的内容全删掉再读取你想要的内容吧。
 楼主| 发表于 2014-8-5 17:09:37 | 显示全部楼层
回复 5# shqf

謝謝大大的回覆~
我想也只能Load XML ~再刪除xmlns的內容~
再讀取~
可是小弟該如何著手??
发表于 2014-8-5 19:11:32 | 显示全部楼层
找了好多文章,终于看到有一篇文章讲到在子元素中还可再声明其他默认命名空间,只是该子元素上声明的默认命名空间作用范围就在该子元素上。唉,如果它说的是正确的话,那是_XMLDomWrapper.au3不支持这种情况还是没有找到方法呢?
如用删除 的方法可如下:
#include <Array.au3>
#include <_XMLDomWrapper.au3>
Local $xml = "Setting.xml"
Local $nxml = @TempDir & "/new.xml"
$ofile=FileOpen ($nxml , 2)
$nxmltext = StringRegExpReplace(FileRead($xml), ' xmlns=.+?"', '')
FileWrite($ofile, $nxmltext)
FileClose($ofile)

$result = _XMLFileOpen($nxml)
If $result = 0 Then Exit
$Path = "/system/setting/appsetting/play/prerollDuration"
$t0 = _XMLGetValue($result, $Path)
If IsArray($t0) Then
        For $k = 1 To UBound($t0) - 1
                MsgBox(0, 0, $t0[$k])
        Next
Else
        MsgBox(0, "", "")
EndIf
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 16:15 , Processed in 0.077546 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表