парсинг xml через linq - PullRequest
       4

парсинг xml через linq

2 голосов
/ 30 декабря 2010

Я пытался найти хороший способ разобрать следующий тип XML, чтобы получить коллекцию объектов, как показано ниже XML.Имейте в виду, вся установка будет динамичной, и схема входящего XML может измениться.Результирующий объект не изменится!По этой причине я также создаю картографический XML, который я собираюсь использовать для анализа входящего XML.

Вот небольшой пример XML-данных.Будет большое количество (20-30) 'записей записей' и разных типов данных, кроме .

<TESTREPORT>
<DATASET>
    <TESTRECORD>
      <ID_SOURCE>Common Value A</ID_SOURCE>
      <TESTDATA>
        <TEST_NAME>Record Number</TEST_NAME>
        <TEST_VALUE>12345</TEST_VALUE>
      </TESTDATA>
      <TESTDATA>
        <TEST_NAME>Software Part Number</TEST_NAME>
        <TEST_VALUE>111111</TEST_VALUE>
      </TESTDATA>
    </TESTRECORD> 
    <TESTRECORD>
      <ID_SOURCE>Common Value B</ID_SOURCE>
      <TESTDATA>
        <TEST_NAME>Record Number</TEST_NAME>
        <TEST_VALUE>23456</TEST_VALUE>
      </TESTDATA>
      <TESTDATA>
        <TEST_NAME>Unit Checksum</TEST_NAME>
        <TEST_VALUE>ABCDEF23</TEST_VALUE>
      </TESTDATA>
    </TESTRECORD> 
</DATASET>

Вот первый черновик XML-сопоставления I 'м предвидение.Проблема, с которой я сейчас сталкиваюсь, заключается в том, как получить-значение «прилипать», когда я перебираю элементы , используя LINQ to XML.

<segment code="TEST" segmentid="2">
<datadetails>
    <datadetail path="REPORT/DATASET/TESTRECORD">
        <datapoint name="Source" path="ID_SOURCE" sticky="??" />
        <datapoint name="Data" path="TESTDATA/TEST_NAME" />
        <datapoint name="Value" path="TESTDATA/TEST_VALUE" />
    </datadetail>
</datadetails>

Вот объект (или его серии), который мне нужно создать:

new Detail { Source = "Common Value A", Data = "Record Number", Value = "12345" };
new Detail { Source = "Common Value A", Data = "Software Part Number", Value = "111111" };
new Detail { Source = "Common Value B", Data = "Record Number", Value = "23456" };
new Detail { Source = "Common Value B", Data = "Unit Checksum", Value = "ABCDEF23" };

Я просто выбросил свой n-й подход и ищу входные данные.Ваша помощь очень ценится!

1 Ответ

2 голосов
/ 30 декабря 2010

Попробуйте это

var results = from testRecord in xdocument.Descendants("TESTRECORD")
              let source = testRecord.Element("ID_SOURCE").Value
              from testData in testRecord.Elements("TESTDATA")
              select new Detail
              {
                  Source = source,
                  Data = testData.Element("TEST_NAME").Value,
                  Value = testData.Element("TEST_VALUE").Value
              };

Это, по сути, SelectMany над вашим XML, извлекающий общий ID_SOURCE для каждого элемента TESTRECORD и применяющий его к внутренним элементам TESTDATA, создавая один IEnumerable<Detail> (предполагается, что вы определили этот класс).

...