missmy06 发表于 2014-8-1 06:50:44

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的值呢?

绿色风 发表于 2014-8-1 07:49:10

XML的 xmlns属性的参考 :传 送 门


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


au3的解决办法只能先删除它的了{:face (239):}

shqf 发表于 2014-8-1 16:37:50

本帖最后由 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",(注意库函数部分内容要修改过)。

missmy06 发表于 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>

shqf 发表于 2014-8-5 15:51:03

本帖最后由 shqf 于 2014-8-5 15:52 编辑

如果xml原文件内容如上所列,仍都用默认命名空间,则我认为那个程式给出的还是不规范,我没有其他好办法了。要不先用一句正则把xmlns的内容全删掉再读取你想要的内容吧。

missmy06 发表于 2014-8-5 17:09:37

回复 5# shqf

謝謝大大的回覆~
我想也只能Load XML ~再刪除xmlns的內容~
再讀取~
可是小弟該如何著手??

shqf 发表于 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
页: [1]
查看完整版本: XML xmlns讀取的疑問