2009-03-05 15 views
0

Ich habe XML nicht zu viel verwendet und brauche ein wenig Hilfe.Wie extrahiere ich Daten aus einer XML-Datei mit Visual Basic?

Meine .NET-Anwendung wird diese XML-Antwort von der öffentlichen Validierungsserver des W3C:

<?xml version="1.0" encoding="UTF-8" ?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
    <env:Body> 
     <m:markupvalidationresponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://www.w3.org/2005/10/markup-validator"> 
      <m:uri>upload://Form Submission</m:uri> 
      <m:checkedby>http://validator.w3.org/</m:checkedby> 
      <m:doctype>-//W3C//DTD XHTML 1.1//EN</m:doctype> 
      <m:charset>utf-8</m:charset> 
      <m:validity>true</m:validity> 
      <m:errors> 
       <m:errorcount>0</m:errorcount> 
       <m:errorlist /> 
      </m:errors> 
      <m:warnings> 
       <m:warningcount>0</m:warningcount> 
       <m:warninglist /> 
      </m:warnings> 
     </m:markupvalidationresponse> 
    </env:Body> 
</env:Envelope> 

ich daraus folgende Werte extrahieren möchten:

  • Uri als String
  • Checkedby als Zeichenfolge
  • Doctype als Zeichenfolge
  • CharSet als Zeichenfolge
  • Gültigkeit als Boolean
  • Errorlist als System.Collections.Generic.List (Of W3CError)
  • WARNING als System.Collections.Generic.List (Of W3CError)

Diese Art W3CError ist ein kleines Klasse habe ich mit den folgenden Eigenschaften:

  • Linie als Integer
  • Col als Integer
  • Nachricht als String
  • Meldungs ​​als String
  • Erklärung als String
  • Quelle als String

Hier ist, was ich habe, so weit gehen. Aber dies nicht funktioniert, ...

 
Dim ResponseReader As Xml.XmlTextReader = New Xml.XmlTextReader(ResponseStream) 
Dim ResponseDocument As New Xml.XPath.XPathDocument(ResponseReader) 
Dim ResponseNavigator As Xml.XPath.XPathNavigator = ResponseDocument.CreateNavigator() 
Dim ResponseIterator As Xml.XPath.XPathNodeIterator 

'uri 
ResponseIterator = ResponseNavigator.Select("uri") 
ResponseIterator.MoveNext() 
_Uri = ResponseIterator.Current.Value 

'checked by 
ResponseIterator = ResponseNavigator.Select("checkedby") 
ResponseIterator.MoveNext() 
_Checkedby = ResponseIterator.Current.Value 

...etc... 

Wie kann ich den gebrochenen Code oben beheben? Oder: Bin ich damit weit weg? Was ist ein besserer Weg?

+1

haben Sie eine WSDL zur Verfügung? VS sollte in der Lage sein, Klassen für Datentypen zu generieren, die vom Webdienst automatisch für Sie bereitgestellt werden, sodass Sie die SOAP-Ausgabe nicht manuell analysieren müssen. – Marek

Antwort

2

Try this

'Import these Namespaces at the top of your file 
Imports System.Linq 
Imports System.Xml.Linq 
Imports <xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
Imports <xmlns:m="http://www.w3.org/2005/10/markup-validator"> 

'in a procedure do this 
Dim doc As XDocument = <?xml version="1.0" encoding="UTF-8" ?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
    <env:Body> 
     <m:markupvalidationresponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://www.w3.org/2005/10/markup-validator"> 
      <m:uri>upload://Form Submission</m:uri> 
      <m:checkedby>http://validator.w3.org/</m:checkedby> 
      <m:doctype>-//W3C//DTD XHTML 1.1//EN</m:doctype> 
      <m:charset>utf-8</m:charset> 
      <m:validity>true</m:validity> 
      <m:errors> 
       <m:errorcount>0</m:errorcount> 
       <m:errorlist /> 
      </m:errors> 
      <m:warnings> 
       <m:warningcount>0</m:warningcount> 
       <m:warninglist /> 
      </m:warnings> 
     </m:markupvalidationresponse> 
    </env:Body> 
</env:Envelope> 

_Uri = doc.Root.<env:Body>.<m:markupvalidationresponse>.<m:uri>.Value 
_Checkedby = doc.Root.<env:Body>.<m:markupvalidationresponse>.<m:checkedby>.Value 
'note that the following code assumes you have a class named W3CError 
_errorList = (From er in doc.Root...<m:errors> _ 
      Select New W3CError With {.Line = CInt(er.<m:line>.Value), .Col = CInt(er.<m:col>.Value), .Message = er.<m:message>.Value, .MessageId = er.<m:messageId>.Value, .Explanation = er.<m:explanation>.Value, .Source = er.<m:source>.Value}).ToList 
'do the same for the _warningList as above 
'now do what you want with it 
+0

Danke. Genau das habe ich gebraucht. –

2

Haben Sie von XPath gehört?

XmlDocument doc = new XmlDocument() 
doc.Load(xml) 
// set the namspace manager, I don't remember exact syntax 
.... 
XmlNode node = doc.SelectSingleNode("//m:checkedby", namespaceManagerThatDeclaresMNamespace); 

Sie Code wahrscheinlich nicht funktionieren, weil Sie die Namespaces in XML ignorieren

+0

+1 - das Namespaces-Problem ist der Schlüssel – Dror

1

Es gibt auch linq2xml. Es befindet sich in System.Xml.Linq. Es verfügt über eine neue XDocument-Klasse, mit der einfacher zu arbeiten ist als mit der älteren System.Xml.XmlDocument-Klasse.

Verwandte Themen