XML xmlns讀取的疑問
以下是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的值呢? XML的 xmlns属性的参考 :传 送 门
注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。[/quote]
au3的解决办法只能先删除它的了{:face (239):} 本帖最后由 shqf 于 2014-8-1 16:45 编辑
楼主,可参照http://www.autoitx.com/forum.php?mod=viewthread&tid=44451&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",(注意库函数部分内容要修改过)。 回复 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> 本帖最后由 shqf 于 2014-8-5 15:52 编辑
如果xml原文件内容如上所列,仍都用默认命名空间,则我认为那个程式给出的还是不规范,我没有其他好办法了。要不先用一句正则把xmlns的内容全删掉再读取你想要的内容吧。 回复 5# shqf
謝謝大大的回覆~
我想也只能Load XML ~再刪除xmlns的內容~
再讀取~
可是小弟該如何著手?? 找了好多文章,终于看到有一篇文章讲到在子元素中还可再声明其他默认命名空间,只是该子元素上声明的默认命名空间作用范围就在该子元素上。唉,如果它说的是正确的话,那是_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
页:
[1]