如何使用Visual Basic从XML文件中提取数据?

时间:2022-08-29 00:01:37

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

我没有太多使用XML,我需要一些帮助。

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

我的.NET应用程序从W3C的公共验证服务器获取此XML响应:

<?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
  • Uri as String

  • Checkedby as String
  • Checkedby String

  • Doctype as String
  • Doctype as String

  • CharSet as String
  • CharSet as String

  • Validity as Boolean
  • 有效性为布尔值

  • ErrorList as System.Collections.Generic.List(Of W3CError)
  • ErrorList as System.Collections.Generic.List(Of W3CError)

  • WarningList 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:

那个类型W3CError是我用以下属性创建的一个小类:

  • Line as Integer
  • 行为整数

  • Col as Integer
  • Col as Integer

  • Message as String
  • 消息为字符串

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

我怎样才能修复上面破碎的代码?或者:我是否偏离了这个轨道?什么是更好的方法?

3 个解决方案

#1


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

#2


Have you heard about XPath?

你听说过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

您的代码可能无法正常工作,因为您忽略了xml中的命名空间

#3


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.

还有linq2xml。它位于System.Xml.Linq中。它有一个新的XDocument类,比旧的System.Xml.XmlDocument类更容易使用。

#1


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

#2


Have you heard about XPath?

你听说过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

您的代码可能无法正常工作,因为您忽略了xml中的命名空间

#3


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.

还有linq2xml。它位于System.Xml.Linq中。它有一个新的XDocument类,比旧的System.Xml.XmlDocument类更容易使用。