在Excel中使用VBA获取XML属性

在Excel中使用VBA获取XML属性,xml,vba,xml-parsing,Xml,Vba,Xml Parsing,我对使用VBA阅读XML响应相当陌生(请原谅我的无知)。有好几篇文章对此进行了解释,但我无法在我的回复中复制。我正在尝试获得标题“H1”和所需的ID“22”。你知道我哪里做错了吗 以下是xml响应: <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/200

我对使用VBA阅读XML响应相当陌生(请原谅我的无知)。有好几篇文章对此进行了解释,但我无法在我的回复中复制。我正在尝试获得标题“H1”和所需的ID“22”。你知道我哪里做错了吗

以下是xml响应:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/">
            <GetListItemsResult>
                <listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
                    <rs:data ItemCount="1">
                        <z:row Title="H1" 
                        RequiredID="22"/>
                    </rs:data>
                </listitems>
            </GetListItemsResult>
        </GetListItemsResponse>
    </soap:Body>
</soap:Envelope>

本质上,您面临的挑战是XML响应中的多个名称空间,其中一个是没有任何前缀的默认名称空间。考虑在SaleStordNeSpEppes属性中定义所有需要的命名空间,然后在XPath下按每个节点指定相应的前缀。任何没有定义前缀的节点都将使用映射到
sp
的默认名称空间

下面将使用
Debug在即时窗口(Ctrl+G)中以标量和循环格式打印相同的
@Title
@RequiredID
值。打印

Sub-GetXML_值()
将listNode设置为MSXML2.IXMLDOMNode,将列表设置为MSXML2.IXMLDOMNodeList
Dim txt作为字符串,文本作为字符串
作为整数的Dim i
Dim XMLDOC作为MSXML2.DOMDocument
设置XMLDOC=New MSXML2.DOMDocument
XMLDOC.async=False
Load(“G:\Sandbox\TitledRequiredXPath.xml”)
XMLDOC.setProperty“SelectionLanguage”、“XPath”
XMLDOC.setProperty“SelectionNamespaces”,“xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/' " & _
“xmlns:sp=”http://schemas.microsoft.com/sharepoint/soap/' " & _
“xmlns:rs='urn:schemas microsoft com:rowset'”&_
“xmlns:z=”#RowsetSchema“
Set lists=XMLDOC.SelectNodes(“//soap:Envelope/soap:Body/sp:GetListItemsResponse/sp:GetListItemsResult/sp:listitems/rs:data”)
txt=XMLDOC.SelectSingleNode(“//rs:data/z:row”).Attributes.getNamedItem(“Title”).Text
打印文本
txt=XMLDOC.SelectSingleNode(“//rs:data/z:row”).Attributes.getNamedItem(“RequiredID”).Text
打印文本
对于列表中的每个listNode
对于listNode.ChildNodes(0.Attributes.Length-1的i=0
Debug.Print listNode.ChildNodes(0).Attributes(i).Text
接下来我
下一个列表节点
设置列表=无
设置XMLDOC=Nothing
端接头
输出

H1
22
H1
22

请尝试
Text=listNode.ChildNodes(0).getAttribute(“Title”)
。一个问题是它没有进入For循环。所以我想我对集合列表中的路径有问题。好东西。For循环的输出工作得很好。非常感谢你的帮助。太好了!很乐意帮忙。XML中的命名空间导航总是很棘手!快乐编码。