通过linq解析xml

发布于 2024-10-10 07:21:08 字数 2098 浏览 0 评论 0原文

我一直在尝试找出一种好方法来解析以下类型的 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 的初稿。我当前遇到的问题是如何在迭代时使值“粘住”。使用 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 种方法并正在寻找输入。非常感谢您的帮助!

I've been tring to figure out a good way to parse the following kind of XML to arrive at a collection of objects as shown below the XML. Mind you, the whole set up is going to be dynamic and the schema of the incoming xml could change. The resulting object will not change! For that reason I am also creating a mapping xml that I'm going to use to parse out the incoming xml.

Here is a small example of a data xml. There will be a large number (20-30) of 'testrecords' and different data types aside from <DATASET>.

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

Here's a first draft of the mapping XML I'm envisioning. The problem I'm currently having is how to get the <ID_SOURCE>-value to "stick" as I iterate through the <TESTDATA> elements using 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>

Here is the object (or series of them) I need to create:

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" };

I just threw out my n-th approach and am looking for input. Your help is greatly appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情话墙 2024-10-17 07:21:08

尝试一下,

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

它基本上是 XML 上的 SelectMany,提取每个 TESTRECORD 元素的公共 ID_SOURCE 并将其应用到内部 TESTDATA 元素,生成单个 IEnumerable (假设您已经定义了该类)。

Try this

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

It's basically a SelectMany over your XML, extracting the common ID_SOURCE for each TESTRECORD element and applying that to the inner TESTDATA elements, producing a single IEnumerable<Detail> (assuming you've defined that class).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文