2017-10-05 3 views
1

Voici le code que j'utiliser pour trouver le texte intérieur d'un certain nœud dans un document DOM d'un élément de la liste de Sharepoint:Pourquoi cette expression XPath ne trouve-t-elle pas le noeud que je veux avec .SelectSingleNode()?

'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 

Cela fonctionne bien lorsque je récupère l'élément de liste par numéro d'identification, mais quand je obtenir l'aide $filter comme ceci:

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

puis lorsque je tente de trouver une valeur en appelant getFieldValueFromXml(result,"Id") il ne trouve pas le nœud. Voici le code XML retourné par l'appel REST ci-dessus:

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

En getFieldValueFromXml(), la valeur .SelectSingleNode(namespaceAndName) call returns Nothing. How should I modify my code to pick up the Id`?

+1

On dirait que vous êtes juste la recherche de la racine. Essayez de rechercher les personnes décédées avec quelque chose comme '.SelectSingleNode (" .// d: Id ")' – Barns

+0

@ barns52, Cela a fonctionné, merci! Je vais accepter cette réponse si vous l'affichez. – sigil

Répondre

3

On dirait que vous recherchez simplement la racine.

Essayez de chercher les personnes décédées avec quelque chose comme:

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