如何从XML文件中读取Version元素值

时间:2012-07-06 08:33:19

标签: xml vb.net

我正在尝试阅读xml文件的版本:

<Order xsi:schemaLocation="urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01 order-v3.xsd urn:schemas-bossfed-co-uk:OP-Order-v1 OP-Order-v1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01">
  <OrderHead>
    <Schema>
      <Version>3.05</Version>
    </Schema>
    <Parameters>
      <Language>en-GB</Language>
      <DecimalSeparator>.</DecimalSeparator>
      <Precision>12.1</Precision>
    </Parameters>
    <OrderCurrency>
      <Currency Code="GBP">GB Pounds</Currency>
    </OrderCurrency>
  </OrderHead>

我正在尝试使用的代码是:

Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode

'Create the XML Document
m_xmld = New XmlDocument()

'Load the Xml file
m_xmld.Load(fileLocation)

'Show all data in your xml
MessageBox.Show(m_xmld.OuterXml)

'Get the list of name nodes
m_nodelist = m_xmld.SelectNodes("/Order/OrderHead/Schema")

For Each m_node In m_nodelist
    GetXmlVersion = m_node.Attributes.GetNamedItem("Version").Value
Next

但是,它不会拉任何东西。

我改为:

Public Shared Function GetXmlVersion (ByVal fileLocation As String) As String
    Dim m_xmld As XmlDocument = New XmlDocument()
    m_xmld.Load (fileLocation)
    GetXmlVersion = m_xmld.SelectSingleNode ("/Order/OrderHead/Schema/Version").InnerText
End Function

我得到了

NullReferenceException未处理 对象引用未设置为对象的实例。

因为m_xmld.selectsinglenode为空

2 个答案:

答案 0 :(得分:2)

您的第一个问题是您尝试将版本作为属性而不是子元素阅读。

第二个问题是您的XML文档具有默认命名空间。这意味着即使没有任何元素明确指定名称空间前缀,它们实际上也属于urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01名称空间。您可能知道,SelectSingleNode方法使用XPath来查找匹配的节点。您可能不知道的是,没有办法强制XPath使用默认命名空间。因此,您需要为属于任何名称空间的每个节点名称指定正确的名称空间。引用Official XPath Specification

中的相关段落
  

使用。将节点测试中的QName扩展为扩展名   表达式上下文中的名称空间声明。这是一样的   对start和end-tags中的元素类型名称进行扩展   除了不使用xmlns声明的默认命名空间: if   QName没有前缀,那么名称空间URI为空(这个   与扩展属性名称的方式相同)。如果这是一个错误   QName有一个前缀,其中没有名称空间声明   表达背景。

因此,你需要做这样的事情:

Public Shared Function GetXmlVersion(ByVal fileLocation As String) As String
    Dim xmld As XmlDocument = New XmlDocument()
    xmld.Load(fileLocation)
    Dim manager As XmlNamespaceManager = New XmlNamespaceManager(xmld.NameTable)
    manager.AddNamespace("n", xmld.DocumentElement.NamespaceURI)
    Return xmld.SelectSingleNode("/n:Order/n:OrderHead/n:Schema/n:Version", manager).InnerText
End Function

在此示例中,xmld.DocumentElement.NamespaceURI返回根元素(urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01)的默认命名空间URI。我们为它指定了前缀“n”,因此我们需要在XPath中的每个元素名称上加上一个“n:”前缀。

另外,您会注意到我已将GetXmlVersion =行更改为Return。使用Return关键字是VB.NET中的首选方法。另外,我将m_xmld变量的名称更改为xmld,因为它令人困惑。通常,当人们在VB中使用m_为变量名称添加前缀时,即表示它是类的私有字段(在类级别,在任何方法之外声明的私有变量)。这里情况不同。 xmld只是一个本地方法变量。

答案 1 :(得分:0)

Version是Schema的子元素,而不是属性。