簡體   English   中英

如何從XML文件中讀取Version元素值

[英]How to read a Version element value from an XML file

我正在嘗試讀取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是Unhandled Object引用,未設置為對象的實例。

因為m_xmld.selectsinglenode為null

您的第一個問題是您嘗試將版本作為屬性而不是子元素讀取。

第二個問題是您的XML文檔具有默認命名空間。 這意味着即使沒有任何元素明確指定名稱空間前綴,它們實際上也屬於urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01名稱空間。 您可能知道, SelectSingleNode方法使用XPath來查找匹配的節點。 您可能不知道的是,沒有辦法強制XPath使用默認命名空間。 因此,您需要為屬於任何名稱空間的每個節點名稱指定正確的名稱空間。 引用官方XPath規范中的相關段落:

使用表達式上下文中的名稱空間聲明,將節點測試中的QName擴展為擴展名。 這與開始和結束標記中的元素類型名稱進行擴展的方式相同,只是不使用使用xmlns聲明的默認名稱空間: 如果QName沒有前綴,則名稱空間URI為null (這是相同的方式屬性名稱已擴展)。 如果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返回根元素的默認名稱空間URI( urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01 )。 我們為它指定了前綴“n”,因此我們需要在XPath中的每個元素名稱上加上一個“n:”前綴。

另外,您會注意到我將GetXmlVersion =行更改為Return 使用Return關鍵字是VB.NET中的首選方法。 此外,我將m_xmld變量的名稱更改為xmld因為它令人困惑。 通常,當人們在VB中使用m_作為變量名稱前綴時,即表明它是該類的私有字段(在類級別,在任何方法之外聲明的私有變量)。 這里情況不同。 xmld只是一個局部方法變量。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM