我正在尝试阅读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为空
答案 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的子元素,而不是属性。