使用XPATH在VBA中选择子xml节点

时间:2017-11-08 09:09:58

标签: xml vba excel-vba xpath xml-namespaces

我正在尝试使用我的excel电子表格构建验证器。 该程序从odata服务中获取数据并解析xml。

我的问题是Debug.Print doc.SelectNodes("d:userId").Item(0).XML似乎什么也没有回复。

我的xml看起来像这样:

<entry>
<content type="application/xml">
            <m:properties>
                <d:userId>user.id</d:userId>
                <d:lastName>name</d:lastName>
                <d:username>user.name</d:username>
                <d:custom01 m:null="true"></d:custom01>
                <d:division>N/A</d:division>
                <d:email>user.name@email.com</d:email>
                <d:department>N/A</d:department>
                <d:empId m:null="true">user.id</d:empId>
                <d:hireDate m:null="true"></d:hireDate>
                <d:jobCode m:null="true"></d:jobCode>
                <d:firstName>user</d:firstName>
                <d:mi m:null="true">N/A</d:mi>
            </m:properties>
</content>
</entry>

这是VBA代码:

Function getSimpleProperty(propertyName As String, parentNode As IXMLDOMNode) As String

    Debug.Print parentNode.SelectSingleNode(".//content")
    getSimpleProperty = parentNode.SelectSingleNode("/entry/content/m:properties/" + propertyName)

End Function

我收到一条错误,上面写着“引用未声明的命名空间前缀:'d'” 我见过其他使用XmlDocument对象的示例,但我使用MSXML2.DOMDocument60

我见过的示例使用命名空间管理器但是要创建一个我需要使用XmlDocumentMSXML2.DOMDocument60中不可用的方法。

Dim nsmgr as XmlNamespaceManager = new XmlNamespaceManager(doc.NameTable) //doc.NameTable is used in XmlDocument but not DOMDocument60

如何创建仅包含MSXML2.DOMDocument60的命名空间管理器  对象,因为我的程序已经与此高度集成,我不想重写整个事情。

编辑

所以我取得了一些进展。

我在加载xml之前添加了这个:

 xmlDoc.setProperty "SelectionLanguage", "XPath"
    xmlDoc.setProperty "SelectionNamespaces", "xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'"

这适用于:

Set findRecord = doc.SelectSingleNode("//d:userId[text()='" + userId + "']").parentNode.parentNode.parentNode

当我尝试

时,这不起作用
Debug.Print parentNode.SelectSingleNode("content/m:properties/")

0 个答案:

没有答案