通过linq解析xml
我一直在尝试找出一种好方法来解析以下类型的 XML,以获得如 XML 下面所示的对象集合。请注意,整个设置将是动态的,传入 xml 的架构可能会发生变化。结果对象将不会改变!出于这个原因,我还创建了一个映射 xml,我将用它来解析传入的 xml。
这是一个数据 xml 的小示例。除了
<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 的初稿。我当前遇到的问题是如何在迭代
<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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试一下,
它基本上是 XML 上的
SelectMany
,提取每个 TESTRECORD 元素的公共 ID_SOURCE 并将其应用到内部 TESTDATA 元素,生成单个IEnumerable
(假设您已经定义了该类)。Try this
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 singleIEnumerable<Detail>
(assuming you've defined that class).