2015-06-24 149 views
1

我目前正試圖用VB.net解析數據來填充一些由子名「eResponse.01」,02,03等選擇的文本框,但是主標籤中的名稱空間/模式位置似乎跳過代碼。使用以下用vb.net解析xml數據

<EMSDataSet> 
<Header> 
    <DemographicGroup> 
     <dAgency.01>0</dAgency.01> 
     <dAgency.02>00</dAgency.02> 
     <dAgency.04>49</dAgency.04></DemographicGroup> 
    <PatientCareReport> 
     <eRecord> 
      <eRecord.01>OpP</eRecord.01> 
      <eRecord.SoftwareApplicationGroup> 
       <eRecord.02>G</eRecord.02> 
       <eRecord.03>Q</eRecord.03> 
       <eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord> 
     <eResponse> 
      <eResponse.AgencyGroup> 
       <eResponse.01>a</eResponse.01> 
       <eResponse.02>BL</eResponse.02></eResponse.AgencyGroup> 
      <eResponse.03>u33</eResponse.03> 

時,但它不填充任何東西,如果我包括命名空間/模式

Dim xmlDoc As New XmlDocument() 
    xmlDoc.Load("C:\Users\james\Desktop\NEMSIS\EMS\xml\Test.xml") 
    Dim xmlns As New XmlNamespaceManager(xmlDoc.NameTable) 
    xmlns.AddNamespace("xsi", "http://www1w3.org/2001/XMLSchema-instance") 
    xmlns.AddNamespace("schemaLocation", "http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd") 
    xmlns.AddNamespace("xmlns", "http://www.nemsis.org") 
    Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/EMSDataSet/Header/PatientCareReport/eResponse") 
    For Each node As XmlNode In nodes 
     TextEdit1.Text = node.SelectSingleNode("eResponse.03").InnerText 
    Next 

工作正常

<EMSDataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nemsis.org http://nemsis.org/media/nemsis_v3/release-3.4.0/XSDs/NEMSIS_XSDs/EMSDataSet_v3.xsd" xmlns="http://www.nemsis.org"> 
<Header> 
    <DemographicGroup> 
     <dAgency.01>0</dAgency.01> 
     <dAgency.02>00</dAgency.02> 
     <dAgency.04>49</dAgency.04></DemographicGroup> 
    <PatientCareReport> 
     <eRecord> 
      <eRecord.01>OpP</eRecord.01> 
      <eRecord.SoftwareApplicationGroup> 
       <eRecord.02>G</eRecord.02> 
       <eRecord.03>Q</eRecord.03> 
       <eRecord.04>P</eRecord.04></eRecord.SoftwareApplicationGroup></eRecord> 
     <eResponse> 
      <eResponse.AgencyGroup> 
       <eResponse.01>a</eResponse.01> 
       <eResponse.02>BL</eResponse.02></eResponse.AgencyGroup> 
      <eResponse.03>u33</eResponse.03> 

什麼,我需要做的就是我的代碼忽略開始標記中的額外數據 - 刪除該信息不是一個選項。

+0

可能重複(http://stackoverflow.com/questions/6275837/add-namespace-using-xmlnamespacemanager-in-c-sharp) – Tim

+1

您需要使用'XmlNamespaceManager' - 在我的重複評論中鏈接了一個示例。 – Tim

+0

我appologize我複製舊代碼 - 我已經嘗試namespacemanager並且要麼失敗的語法,要麼不明白它 - 編輯,以顯示什麼使用 –

回答

1

你的XML有前綴的命名空間 - 也被稱爲默認命名空間 - 在這裏:

xmlns="http://www.nemsis.org" 

不像前綴名字空間,後代元素繼承祖先的默認命名空間隱含

要訪問命名空間中的元素,你需要在你的XPath正確使用註冊的前綴,並通過命名空間管理爲SelectNodes()第二個參數和SelectSingleNode():的[在C#中添加使用的XmlNamespaceManager命名空間]

...... 
xmlns.AddNamespace("d", "http://www.nemsis.org") 
Dim xpath As String = "/d:EMSDataSet/d:Header/d:PatientCareReport/d:eResponse" 
Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes(xpath, xmlns) 
For Each node As XmlNode In nodes 
    TextEdit1.Text = node.SelectSingleNode("d:eResponse.03", xmlns).InnerText 
Next 
+0

我曾嘗試此更早但收到一個錯誤,指出System.ArgumentException:前綴「xmlns」是保留供XML使用。 at EPC.Form1.Form1_Load(Object sender,EventArgs e)in System.Xml.XmlNamespaceManager.AddNamespace(String prefix,String uri) F:\ FTDEPCR \ EPCR \ EPCR \ Form1.vb:第47行 –

+1

現在編輯完美的作品。 –

+0

我不知道'xmlns'是保留的,認爲任何前綴都可以,只要它指向正確的uri – har07