2009-03-05 6 views
0

Je n'ai pas trop utilisé XML et j'ai besoin d'un peu d'aide.Comment puis-je extraire des données d'un fichier XML avec Visual Basic?

Mon application .NET obtient cette réponse XML du serveur de validation publique du 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> 

Je veux extraire de cela les valeurs suivantes:

  • Uri comme chaîne
  • Checkedby comme Chaîne
  • Doctype as String
  • CharSet as String
  • Validité comme Boolean
  • ErrorList comme System.Collections.Generic.List (de W3CError)
  • WARNINGLIST comme System.Collections.Generic.List (de W3CError)

Ce genre W3CError est un petit classe I créé avec les propriétés suivantes:

  • ligne Integer
  • Col en entier
  • message as String
  • MessageId as String
  • Explication as String
  • Source as String

Voici ce que je vais jusqu'à présent. Mais, cela ne fonctionne pas ...

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

Comment puis-je corriger le code cassé au-dessus? Ou: Suis-je loin de cela? Quoi de mieux?

+1

avez-vous un WSDL disponible? VS devrait être capable de générer automatiquement des classes pour les types de données exposés par le service Web, de sorte que vous n'avez pas besoin d'analyser manuellement la sortie SOAP. – Marek

Répondre

2

Essayez cette

'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

Merci. C'est exactement ce dont j'avais besoin. –

2

Avez-vous entendu parler de XPath?

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

Code Vous avez probablement ne fonctionnent pas parce que vous ignorez les espaces de noms XML

+0

+1 - le problème des espaces de noms est la clé – Dror

1

Il y a aussi linq2xml. Il est situé dans System.Xml.Linq. Il a une nouvelle classe XDocument qui est plus facile à utiliser que l'ancienne classe System.Xml.XmlDocument.