sigil
sigil

Reputation: 9546

Why isn't this XPath expression finding the node I want with .SelectSingleNode()?

Here's the code that I use to find the inner text of a certain node in a DOM document of a Sharepoint list item:

'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

This works fine when I retrieve the list item by ID number, but when I get it using $filter like this:

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

then when I try to find a value by calling getFieldValueFromXml(result,"Id") it doesn't find the node. Here is the XML returned by the above REST call:

<?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>

In getFieldValueFromXml(), the .SelectSingleNode(namespaceAndName) call returns Nothing. How should I modify my code to pick up theId` value?

Upvotes: 1

Views: 224

Answers (1)

Barns
Barns

Reputation: 4848

It looks like your are just searching the root.

Try searching the decedents with something like:

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

Upvotes: 3

Related Questions