[英]Parse XML containing namespaces in VB.Net
我發現了幾個相關的問題,但是沒有一個給我辦法。
我有一個具有以下結構的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAssessmentItemTimed xmlns:xsi="http://a.b.c/" xmlns:xsd="http://d.e.f" xmlns="http://g.h.i">
<AssessmentItemTimed>
<CustomerId>306</CustomerId>
<AssessmentId>1959060</AssessmentId>
<ExternalReference />
<License>0577HJK</License>
<ChassisNumber>VF1KT1RG646667276</ChassisNumber>
<CostTraditional>2771.16</CostTraditional>
<CostCommercial>2771.16</CostCommercial>
<Kilometers>90957</Kilometers>
<TimeOrdered>2017-02-13T16:31:00.48</TimeOrdered>
<TimeClosed>2017-02-17T17:09:43.14</TimeClosed>
</AssessmentItemTimed>
<AssessmentItemTimed>
<CustomerId>306</CustomerId>
<AssessmentId>1959061</AssessmentId>
<ExternalReference />
<License>0918HHM</License>
<ChassisNumber>VF1KT1RG646272649</ChassisNumber>
<CostTraditional>3293.33</CostTraditional>
<CostCommercial>3293.33</CostCommercial>
<Kilometers>158142</Kilometers>
<TimeOrdered>2017-02-13T16:31:01.73</TimeOrdered>
<TimeClosed>2017-02-16T21:05:38.98</TimeClosed>
</AssessmentItemTimed>
</ArrayOfAssessmentItemTimed>
如果僅從標記中刪除名稱空間,則只能獲取所需的數據。 這是我當前的代碼:
Dim xmlnode As XmlDocument
Dim nodeList As XmlNodeList
Dim node As XmlNode
Dim nsmgr As XmlNamespaceManager
Try
xmlnode = New XmlDocument()
xmlnode.Load("file.xml")
nsmgr = New XmlNamespaceManager(xmlnode .NameTable)
nodeList = xmlnode.DocumentElement.SelectNodes("/sd:ArrayOfAssessmentItemTimed/sd:AssessmentItemTimed", nsmgr)
For Each xmlnode In nodeList
Dim plateNumber = xmlnode.SelectSingleNode("sd:License", nsmgr).InnerText
Dim chassisNumber = xmlnode.SelectSingleNode("sd:ChassisNumber", nsmgr).InnerText
Dim Kilometers = mlnode.SelectSingleNode("sd:Kilometers", nsmgr).InnerText
'test if works
MsgBox("License: " & plateNumber & vbCrLf _
& "Chassis: " & chassisNumber & vbCrLf _
& "Kms: " & Kilometers & vbCrLf & vbCrLf
)
Next
Catch errorVariable As Exception
'Error trapping
MsgBox(errorVariable.ToString())
End Try
哪一種是排除xmlns值的正確方法? 我真的不了解XmlNamespaceManager,所以無法得到正面的結果。
感謝您的所有建議。
您需要先使用XmlNamespaceManager
注冊前綴“ sd”,然后才能在XPath查詢中使用它。 確保將前綴映射到默認名稱空間http://ghi
:
....
nsmgr = New XmlNamespaceManager(New XmlNameTable())
nsmgr.AddNamespace("sd", "http://g.h.i");
nodeList = xmlnode.DocumentElement.SelectNodes("/sd:ArrayOfAssessmentItemTimed/sd:AssessmentItemTimed", nsmgr)
....
XPath始終將不帶前綴的元素視為具有空名稱空間的元素,它沒有默認名稱空間的概念(只有XML具有),這就是為什么您需要在此處構成前綴“ sd”的原因。
您可以查看如何:聲明和使用XML命名空間前綴 ,以找到更簡單的選擇。
Imports <xmlns="http://g.h.i">
和樣品使用:
'' Dim xDoc = System.Xml.Linq.XDocument.Load("file.xml")
Dim xDoc = <?xml version="1.0" encoding="utf-8"?>
<ArrayOfAssessmentItemTimed xmlns:xsi="http://a.b.c/"
xmlns:xsd="http://d.e.f" xmlns="http://g.h.i">
<AssessmentItemTimed>
<License>0577HJK</License>
<ChassisNumber>VF1KT1RG646667276</ChassisNumber>
<Kilometers>90957</Kilometers>
</AssessmentItemTimed>
<AssessmentItemTimed>
<License>0918HHM</License>
<ChassisNumber>VF1KT1RG646272649</ChassisNumber>
<Kilometers>158142</Kilometers>
</AssessmentItemTimed>
</ArrayOfAssessmentItemTimed>
For Each x In xDoc.<ArrayOfAssessmentItemTimed>.<AssessmentItemTimed>
MsgBox("License: " & vbTab & x.<License>.Value & vbLf &
"Chassis: " & vbTab & x.<ChassisNumber>.Value & vbLf &
"Kms: " & vbTab & x.<Kilometers>.Value & vbLf)
Next
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.