【问题标题】:Why isn't this XPath expression finding the node I want with .SelectSingleNode()?为什么这个 XPath 表达式不能用 .SelectSingleNode() 找到我想要的节点?
【发布时间】:2018-03-17 10:28:16
【问题描述】:

这是我用来在 Sharepoint 列表项的 DOM 文档中查找某个节点的内部文本的代码:

'parse XML of a list item to get the field value
Private Function getFieldValueFromXml(xml As Variant, fieldName As Variant) As Variant

Dim node As IXMLDOMNode
Dim namespaceAndName As String

'set namespace string for XPath search, using field name
namespaceAndName = "/d:" & fieldName

Set domDoc = New DOMDocument60

'load DOM document with XML
domDoc.LoadXML xml

'set selection namespace for XPath search
domDoc.SetProperty "SelectionNamespaces", "xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices'"

'get first node with this namespace (a list item should have only one node with a given field name)
Set node = domDoc.SelectSingleNode(namespaceAndName)

getFieldValueFromXml = node.text

End Function

当我按 ID 号检索列表项时,这很好用,但是当我使用 $filter 获取它时,如下所示:

https://sps.utility.xyz.com/Sites/ABC/_api/web/lists/GetByTitle('Stations')/items?$filter=Title eq '020'

然后当我尝试通过调用getFieldValueFromXml(result,"Id") 来查找值时,它找不到节点。以下是上述 REST 调用返回的 XML:

<?xml version="1.0"?>
<feed xml:base="https://sps.utility.abc.com/Sites/asdaC/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
<id>5a608d14-721b-4076-9ed0-91eccd9b70ec</id>
<title/>
<updated>2017-10-04T22:24:47Z</updated>
<entry m:etag="&quot;42&quot;">
<id>Web/Lists(guid'f9565c6c-334c-4953-a117-5dd9b0cd38a5')/Items(415)</id>
<category term="SP.Data.StationsListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<title/>
<updated>2017-10-04T22:24:47Z</updated>
<author>
<name/>
</author>
<content type="application/xml">
<m:properties>
<d:FileSystemObjectType m:type="Edm.Int32">0</d:FileSystemObjectType>
<d:Id m:type="Edm.Int32">415</d:Id>
<d:ReferenceImages m:type="SP.FieldUrlValue">
<d:Description>some number 131553</d:Description>
<d:Url>http://google.com</d:Url>
</d:ReferenceImages>
<d:CDScope m:type="Edm.Boolean">true</d:CDScope>
<d:ID m:typ
e="Edm.Int32">415</d:ID>
<d:Modified m:type="Edm.DateTime">2017-10-04T20:15:54Z</d:Modified>
<d:Created m:type="Edm.DateTime">2016-03-27T19:21:49Z</d:Created>
<d:AuthorId m:type="Edm.Int32">50</d:AuthorId>
<d:EditorId m:type="Edm.Int32">330</d:EditorId>
<d:OData__UIVersionString>18.0</d:OData__UIVersionString>
<d:Attachments m:type="Edm.Boolean">false</d:Attachments>
<d:GUID m:type="Edm.Guid">f31fcf07-0d81-442e-8621-56d09a8507f6</d:GUID>
</m:properties>
</content>
</entry>
</feed>

getFieldValueFromXml() 中,.SelectSingleNode(namespaceAndName) call returns Nothing. How should I modify my code to pick up theId 的值?

【问题讨论】:

  • 看起来您只是在搜索根目录。尝试使用 .SelectSingleNode(".//d:Id") 之类的内容搜索死者
  • @barns52,成功了,谢谢!如果您发布该答案,我会接受。

标签: xml vba dom xpath


【解决方案1】:

看起来您只是在搜索根目录。

尝试使用以下内容搜索死者:

.SelectSingleNode(".//d:Id")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多