kjohansen2000 Ответов: 1

Разбор конкретного XML в VB.NET


Привет,

Я не так часто пишу код, и я забываю. Поэтому вместо того, чтобы часами гуглить то, что я не знаю, как называется, я задаю вопрос здесь, у экспертов :)

Я хочу получить конкретные значения из этого XML:

<?xml version="1.0" encoding="UTF-16" ?>
<ROOT>
   <TREE Version="01.00" Company="OTHER" StationNr="0111">
      <Device Type="1">
         <Property Type="1">111</Property>
         <Device Type="2" Number="1">
            <Property Type="34">INT</Property>
            <Device Type="3">
               <Device Type="4" Number="1">
                  <Property Type="56">192.168.242.192</Property>
                  <Device Type="29">
                     <Property Type="71">11016938</Property>
				  </Device>
               </Device>
               <Device Type="4" Number="2">
                  <Property Type="56">192.168.242.193</Property>
                  <Device Type="29">
                     <Property Type="71">11016933</Property>
                  </Device>
               </Device>
            </Device>
         </Device>
      </Device>
   </TREE>
</ROOT>


Вот что я ищу:
Я хочу найти атрибут свойства 56 и получить значение 192.168.242.192 при чтении.
Я также хочу перебрать свойство типа 2, чтобы найти все устройства типа 4.
Я также хотел бы получить значение Property Type="71" из этого.

У меня есть несколько примеров из моего прошлого кодирования, но ни один XML, который я использовал в прошлом, не выглядит так, как этот.

Есть идеи, что искать?

С уважением
Кеннет

Что я уже пробовал:

Я пробовал использовать некоторые старые фрагменты кода и гуглить то, что не могу найти

Maciej Los

Я не вижу "тип свойства 2" в xml-файле, который вы опубликовали.
Описание того, чего вы хотите достичь, не совсем понятно. Пожалуйста, будьте более конкретны и предоставьте образец вывода.

1 Ответов

Рейтинг:
7

Maciej Los

Взгляните на приведенный ниже пример:

Dim xdoc As XDocument = XDocument.Load("FullFileName.xml")
Dim deviceTypes2find As String() = {"1", "4"}
Dim propTypes2find As String() = {"56", "71"}

Dim result = xdoc.Descendants("Property"). _
    Where(Function(x) propTypes2find.Any(Function(a) x.Attribute("Type").Value=a) AndAlso _
        deviceTypes2find.Any(Function(y) x.Parent.Attribute("Type").Value = y)). _
    Select(Function(x) Tuple.Create(x.Parent.Attribute("Type").Value, x.Attribute("Type").Value, x.Value)). _
    ToList()
Console.WriteLine(String.Format("{0}{1}{2}{1}{3}", "DeviceTypeId", Microsoft.VisualBasic.vbTab, "PropertyTypeId", "Value"))
For Each t As Tuple(Of String, String, String) In result
    Console.WriteLine(String.Format("{0}{1}{2}{1}{3}", t.Item1, Microsoft.VisualBasic.vbTab, t.Item2, t.Item3))
Next


Результат:
DeviceTypeId PropertyTypeId  Value
4            56              192.168.242.192
4            56              192.168.242.193


kjohansen2000

Большое вам спасибо, это занимает у меня очень хорошую часть пути и научило меня чему-то новому!

Файлы, которые мне нужно прочитать, на самом деле близки к 10.000 строкам и множеству дублированных чисел "типа".
Можете ли вы дать мне подсказку, чтобы прочитать файл в иерархическом порядке?

Читая файл как человек, я вижу, что тип устройства 1 имеет тип устройства 2, а у этого есть тип устройства 3, который имеет 2x тип устройства 4. Эти устройства типа 4 имеют свой собственный тип 56, но 56 также является значением в типе 1, поэтому я хотел бы посмотреть, принадлежит ли Тип 56, который я читаю, к типу 4 или типу 1, имеет ли это смысл?

Извините, что не опубликовал полный файл.

Maciej Los

Есть ли у других устройств узлы с типами свойств 56 и 71?
В приведенном примере устройства с типами 1,2,3 не имеют узлов с типами свойств 56 и 71...

kjohansen2000

Правильно, я пытался ограничить файл необходимым, но, возможно, это просто затруднило мне получение помощи.

Да, другие устройства также имеют 56 и 71-е годы

Maciej Los

См. обновленный ответ (еще раз).

kjohansen2000

Я должен тебе большую кружку холодного пива на солнышке.. СПАСИБО!!!

Maciej Los

Что ж...
Датское пиво очень хорошее, поэтому я воспользуюсь преимуществом встречи за пивом на солнце. Я возьму польское пиво, чтобы дать вам возможность попробовать его. Но(!) нам придется подождать, пока вероятность заражения COVID-19 будет очень мала.

Удачи вам!