[英]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.