2015-06-24 1 views
1

В настоящее время я пытаюсь проанализировать данные с помощью VB.net, чтобы заполнить некоторые текстовые поля, выбрав по имени «eResponse.01», 02, 03 и т. Д., Однако расположение пространства имен/схемы в главном теге кажется отключите код.разбор данных xml с помощью vb.net

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> 
<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> 

однако это ничего не заполнять, если я включать пространство имен/Schema

<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

возможного дубликата [добавить пространство имен, используя XmlNamespaceManager в C#] (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 и передать менеджеру пространства имен в качестве 2-го аргумента SelectNodes() и SelectSingleNode():

...... 
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. в System.Xml.XmlNamespaceManager.AddNamespace (префикс String, String uri) на EPCR.Form1.Form1_Load (отправитель объекта, EventArgs e) в формате F: \ FTDEPCR \ EPCR \ EPCR \ Form1.vb: строка 47 –

+1

Редактировать сейчас работает отлично. –

+0

Я не знал, что 'xmlns' зарезервирован, думал, что любой префикс в порядке, если он указывает на правильный uri – har07