Как мне прочитать конкретный раздел XML-файла — VB.Net

#xml #vb.net #xml-parsing

#xml #vb.net #xml-синтаксический анализ

Вопрос:

Пожалуйста, взгляните на приведенный ниже XML

 <MessageHeader>
   <Master branch_name="ABCD" ref_date="2020-09-23 11:43:46" refno="1">
      <mbl_no>1234566</mbl_no>
      <mbl_date>2020-08-25 00:00:00</mbl_date>
      <agent_code>XXXXX</agent_code>
      <agent_name>XXXX YYYYY</agent_name>
      <carrier_code>1234</carrier_code>
      <carrier_name>XXXXX</carrier_name>
      <pol_code>XXX1234</pol_code>
      <pol_name>XXXX,YYYY</pol_name>
      <HouseBill> 
        <House slno="1" house_no="XXDEL233695">
          <shipper_code>3023233324</shipper_code>
          <shipper_name>..Shipper Name...</shipper_name>
          <shipper_add1>... Address 1... </shipper_add1>
          <shipper_add2>... Address 2...</shipper_add2>
          <shipper_add3/>
          <shipper_add4/>
        </House>
     </HouseBill>
   </Master>
</MessageHeader>


  

Я пытаюсь прочитать эту информацию в наборе данных, используя приведенный ниже код:

 Dim xmlFile As XmlReader
Dim importFileName As String = "C:107.xml"
xmlFile = XmlReader.Create(importFileName, New XmlReaderSettings())
Dim ds As New DataSet
ds.ReadXml(xmlFile)
  

Это отлично работает для меня, и я могу получить доступ к столбцам как таковым:

 Dim shipperName As String = ds.tables("House").rows(x).Item("shipper_name").tostring()
  

Мой вопрос в том, как мне получить доступ к таким элементам, как slno и house_no, из родительского узла?

Спасибо

Комментарии:

1. Почему dataset? VB . Net отлично справляется с XML, не прибегая к dataset.

2. Я адаптирую некоторый существующий код для включения другого XML-макета, и для меня это быстрее.

3. На всякий случай я предоставил ответ, который не использует dataset.

Ответ №1:

Без набора данных

     Dim xmlFile As XElement
    Dim importFileName As String = "C:107.xml"
    ' xmlFile = XElement.Load(importFileName)

    'for testing use litersl
    xmlFile = <MessageHeader>
                  <Master branch_name="ABCD" ref_date="2020-09-23 11:43:46" refno="1">
                      <mbl_no>1234566</mbl_no>
                      <mbl_date>2020-08-25 00:00:00</mbl_date>
                      <agent_code>XXXXX</agent_code>
                      <agent_name>XXXX YYYYY</agent_name>
                      <carrier_code>1234</carrier_code>
                      <carrier_name>XXXXX</carrier_name>
                      <pol_code>XXX1234</pol_code>
                      <pol_name>XXXX,YYYY</pol_name>
                      <HouseBill>
                          <House slno="1" house_no="XXDEL233695">
                              <shipper_code>3023233324</shipper_code>
                              <shipper_name>..Shipper Name...</shipper_name>
                              <shipper_add1>... Address 1... </shipper_add1>
                              <shipper_add2>... Address 2...</shipper_add2>
                              <shipper_add3/>
                              <shipper_add4/>
                          </House>
                      </HouseBill>
                  </Master>
              </MessageHeader>

    Dim shipperName As String = xmlFile.<Master>.<HouseBill>.<House>.<shipper_name>.Value
    Dim slno As String = xmlFile.<Master>.<HouseBill>.<House>.@slno
    Dim house_no As String = xmlFile.<Master>.<HouseBill>.<House>.@house_no
  

для производства

     Dim xmlFile As XElement
    Dim importFileName As String = "C:107.xml"
    xmlFile = XElement.Load(importFileName)

    Dim shipperName As String = xmlFile.<Master>.<HouseBill>.<House>.<shipper_name>.Value
    Dim slno As String = xmlFile.<Master>.<HouseBill>.<House>.@slno
    Dim house_no As String = xmlFile.<Master>.<HouseBill>.<House>.@house_no
  

Комментарии:

1. Каждое из этих значений ничего не возвращает при тестировании. Я должен добавить, что это только часть XML-файла, если это имеет значение.

2. Вы должны показать что-то репрезентативное для данных. Если вы запустите код, используя литерал, он работает/

3. Вы правы. Если я запускаю тестовый код, он работает. Если я запускаю производственный код, каждое значение ничего не значит. Это может быть связано с другими элементами, которые я не включил в свой первоначальный пост. Глядя на полную структуру, она выглядит следующим образом: <Master branchname=»xyz» ref=»123″> <Домашняя накладная> Это довольно большой XML-файл, я только включил вышесказанное, когда выбрал опцию dataset

4. Я предоставил более подробную информацию о том, как на самом деле выглядит полный файл

5. Набор данных не будет работать.. Это приведет к фрагментации результатов на множество таблиц данных, которые действительно нельзя использовать. Вы можете использовать DataSet ReadXml только в том случае, если число потомков не превышает 4. Используется корневой тег и имя набора данных. Первые дочерние элементы — это имена таблиц. Вторые дочерние элементы — это имена столбцов. Четвертые дочерние элементы — это данные строки. У вас есть шесть слоев тегов, и в результате получается множество таблиц данных с фрагментами данных в каждой таблице.