2016-05-11 11 views
0

Hey alles, was ich habe den folgenden Code, den ich in Not bin, die Klasse zu finden in:Parsen von XML mit Klasse, die eindeutig nummeriert sind

Dim nodelist As System.Xml.XmlNodeList = Nothing 
Dim doc As New System.Xml.XmlDocument() 

doc.LoadXml(tmpData) 
nodelist = doc.SelectNodes("//entry/content/sp_0:div/span/sp_0:span") 

For Each node As System.Xml.XmlElement In nodelist 
    Debug.print(node("OrderID").InnerText) 
Next 

Und die XML sieht wie folgt aus:

<feed 
    xmlns:app="http://www.w3.org/2007/app" 
    xmlns:thr="http://purl.org/syndication/thread/1.0" 
    xmlns:fh="http://purl.org/syndication/history/1.0" 
    xmlns:snx="http://www.ibm.com/xmlns/prod/sn" 
    xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" 
    xmlns="http://www.w3.org/2005/Atom"> 
    <id>2006:feed</id> 
    <generator version="5.0.0.0" uri="http://www.ibm.com/xmlns/prod/sn">IBM Connections - Profiles</generator> 
    <title type="text">reporting chain for Bill Gates</title>   
    <opensearch:itemsPerPage>8</opensearch:itemsPerPage> 
    <fh:complete></fh:complete> 
    <link 
     href="http://..." 
     rel="self" 
     type="application/atom+xml"></link> 
    <entry> 
     <id>tag:profiles.ibm.com,2006</id> 
     <title type="text">Bill Gates</title> 
     <updated>2016-05-11T06:39:54.908Z</updated> 
     <category term="profile" scheme="http://www.ibm.com/xmlns/prod/sn/type"></category> 
     <contributor> 
      <name>Bill Gates</name> 
      <snx:userid>010101</snx:userid> 
      <email>[email protected]</email> 
      <snx:userState>active</snx:userState> 
      <snx:isExternal>false</snx:isExternal> 
     </contributor> 
     <link 
      href="http://..." 
      rel="http://www.ibm.com/xmlns/prod/sn/profile-type" 
      type="application/profile-type+xml"></link> 
     <thr:in-reply-to> 
      <app:accept>ref</app:accept> 
      <app:accept>tag:profiles.ibm.com,2006</app:accept> 
     </thr:in-reply-to> 
     <summary type="text">Profile information for Bill Gates</summary> 
     <content type="xhtml"> 
      <sp_0:div 
       xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:sp_0="http://www.w3.org/1999/xhtml"> 
       <sp_0:span class="vcard"> 
        <sp_0:div class="x-groupwareMail" style="display:none"></sp_0:div> 
        <sp_0:div class="org"> 
         <sp_0:span class="organization-unit"></sp_0:span> 
        </sp_0:div> 
        <sp_0:div class="role"></sp_0:div> 
        <sp_0:div class="title">Applications Developer/Analyst</sp_0:div> 
        <sp_0:div class="uid">265418</sp_0:div> 
        <sp_0:div class="x-profile-uid">010101</sp_0:div> 
        <sp_0:div class="x-lconn-userid">265418</sp_0:div> 
       </sp_0:span> 
      </sp_0:div> 
     </content> 
    </entry> 
    <entry> 
     etc....    
    </entry> 
</feed> 

ich erhalte eine Fehlermeldung auf Nodelist = doc.SelectNodes ("// Eintrag/content/sp_0: div/span/sp_0: span") sagen:

Namespace-Manager oder XsltContext erforderlich. Diese Abfrage hat ein Präfix, eine Variable oder eine benutzerdefinierte Funktion.

Wie kann ich den internen Text von dieser Klasse bekommen?

+0

Mögliches Duplikat von [Verwendung von XPath und VB.NET zum Parsen von XML mit Namespaces] (http://stackoverflow.com/questions/16949495/using-xpath-and-vb-net-to-parse-xml-containing- namespsaces) – DWRoelands

+0

@DWRoelands ** nicht ** ein Duplikat aufgrund der besagten Frage unterschiedlicher Klassenwertnamen. – StealthRT

Antwort

1

Sie müssen die XmlNamespaceManager Klasse verwenden, um die Namespaces in Ihrem XPath verwendet, um zu definieren, und dies auf die SelectNodes Methode übergeben. Außerdem konnte ich keinen leeren Namespace für den Standard-Namespace erhalten (vielleicht eine Einschränkung mit XPath?), Daher musste ich ein Präfix dafür definieren.

Auch Ihr XPath scheint nicht mit Ihrer Beispiel-XML übereinzustimmen. Lassen Sie uns sagen Sie den Wert für das <sp_0:div class="x-profile-uid">010101</sp_0:div> Element erhalten wollten, würden Sie so etwas wie dies wollen:

Dim nodelist As System.Xml.XmlNodeList = Nothing 
Dim doc As New System.Xml.XmlDocument() 

doc.LoadXml(tmpData) 

Dim nsmgr = New XmlNamespaceManager(doc.NameTable) 
nsmgr.AddNamespace("atom", "http://www.w3.org/2005/Atom") 
nsmgr.AddNamespace("sp_0", "http://www.w3.org/1999/xhtml") 

nodelist = doc.SelectNodes(
    "//atom:entry/atom:content/sp_0:div/sp_0:span/sp_0:div[@class='x-profile-uid']", 
    nsmgr 
) 

For Each node As System.Xml.XmlElement In nodelist 
    Debug.Print(node.InnerText) 
Next 

Welche Ausgänge:

010101 

Hoffentlich Sie diese an Ihre Bedürfnisse anpassen können.

+0

Wie viel von dem Code würde sich ändern, seit ** sp_0: div ** geändert zu ** sp_0: div **, ** sp_1: div **, ** sp_2: div **, etc, die ich nicht wie viele wissen werde _xx wird es sein? – StealthRT

+0

@StealthRT Sind 'sp_0',' sp_1' usw. verschiedene Namespaces oder nur verschiedene Präfixe für denselben Namespace? Es ist dem XPath egal, welche Präfixe Ihr XML verwendet, nur dass die Namespaces übereinstimmen. – Mark

+0

Es ist innerhalb der * SelectNodes * also ** // atom: entry/atom: content/sp_0: div/sp_0: span/sp_0: div [@ class = 'x-profile-uid'] ** wäre so etwas wie * * // atom: eintrag/atom: content/sp_0: div/sp_0: span/sp_0: div [@klasse = 'x-profile-uid'] **, ** // atom: eintrag/atom: content/sp_1 : div/sp_1: span/sp_1: div [@ class = 'x-profile-uid'] **, ** // atom: eintrag/atom: content/sp_2: div/sp_2: span/sp_2: div [@ class = 'x-profile-uid'] **, etc .. und auch ** nsmgr.AddNamespace ("sp_0", "http://www.w3.org/1999/xhtml")**, * * nsmgr.AddNamespace ("sp_1", "http://www.w3.org/1999/xhtml")**, usw. – StealthRT

0

Sie sollten den Namespace "sp_0" genauso definieren, wie Sie die anderen Namespaces (xmlns: app = "...") im Wurzelelement definiert haben.

Sehen Sie sich die letzte Zeile des Elements an: So definieren Sie den Namespace für SP_0.

<feed 
xmlns:app="http://www.w3.org/2007/app" 
xmlns:thr="http://purl.org/syndication/thread/1.0" 
xmlns:fh="http://purl.org/syndication/history/1.0" 
xmlns:snx="http://www.ibm.com/xmlns/prod/sn" 
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" 
xmlns="http://www.w3.org/2005/Atom" 
sp_0="http://www.w3.org/1999/xhtml"> 

+0

Können Sie ein Codebeispiel zeigen? – StealthRT