0

I've not used XML too much and I need a little help.

My .NET application gets this XML response from the W3C's public validation server:

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

I want to extract from this the following values:

  • Uri as String
  • Checkedby as String
  • Doctype as String
  • CharSet as String
  • Validity as Boolean
  • ErrorList as System.Collections.Generic.List(Of W3CError)
  • WarningList as System.Collections.Generic.List(Of W3CError)

That type W3CError is a small class I created with the following properties:

  • Line as Integer
  • Col as Integer
  • Message as String
  • MessageId as String
  • Explanation as String
  • Source as String

Here's what I've go so far. But, this doesn't work...

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

How can I fix the broken code above? Or: Am I way off track with this? What's a better way?

1
  • 1
    do you have a WSDL available? VS should be able to generate classes for data types exposed by the web service for you automatically so you do not have to parse the SOAP output by hand. Commented Apr 8, 2010 at 5:12

3 Answers 3

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
Sign up to request clarification or add additional context in comments.

Comments

2

Have you heard about 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);

You code probably don't work because you are ignoring the namespaces in xml

Comments

1

There is also linq2xml. It is located in System.Xml.Linq. It has a new XDocument class that is easier to work with than the older System.Xml.XmlDocument class.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.