我正在使用返回以下xml响应的第三方系统
{<origenxml type="data">
<data>
<item>
<id><![CDATA[PIN/4590/67]]></id>
<filename><![CDATA[CS.STAR]]></filename>
<group>
<id>MAIN</id>
<dictionary id="CS.ST.BOXNO">
<desc><![CDATA[boxes]]></desc>
<value ln="0"></value>
<raw-value ln="0"></raw-value>
<value ln="1"><![CDATA[121880 ]]></value>
<raw-value ln="1"><![CDATA[B-FILE394**BCBF*BC*121880*]]></raw-value>
<value ln="2"><![CDATA[121881 ]]></value>
<raw-value ln="2"><![CDATA[B-FILE394**BCBF*BC*121881*]]></raw-value>
<value ln="3"><![CDATA[121882 ]]></value>
<raw-value ln="3"><![CDATA[B-FILE394**BCBF*BC*121882*]]></raw-value>
<value ln="4"><![CDATA[940288 ]]></value>
<raw-value ln="4"><![CDATA[B-FILE80**BCBF*BC*940288*]]></raw-value>
<value ln="5"><![CDATA[170415 ]]></value>
<raw-value ln="5"><![CDATA[ALPHA**BC*BC*170415*]]></raw-value>
</raw-value>
</dictionary>
</group>
</item>
</data>
</origenxml>}
Boxes下的每一行代表一个对象,其中值为Id,原始值为数据(因此第5行 - ID = 170415,值= ALPHA ** BC * BC * 170415 *)但我真的无法找出解析xml的最佳方法。我无法控制响应xml,所以我不能像额外的节点名称那样有用
答案 0 :(得分:1)
首先,我想确保这确实是XML,因为它格式不正确。在</raw-value>
之前,</dictionary>
有一个浮动结束标记。假设这是一个错误,那么使用Linq over XML就可以轻松解决问题。
您需要添加以下using
语句:
using System.IO;
using System.Xml.Linq;
我在控制台应用程序中创建了此示例,但您应该能够轻松地对其进行调整。第一步是从XML创建XDocument
对象。我从常量字符串值中提取文本。
static XDocument CreateDocument()
{
using (var reader = new StringReader(testData)) {
return XDocument.Load(reader);
}
}
其余的只是创建一个查询并枚举它。
var doc = CreateDocument();
var results = from value in doc.Descendants("value")
join rawValue in doc.Descendants("raw-value")
on value.Attribute("ln").Value equals rawValue.Attribute("ln").Value
select new { Value = value.Attribute("ln").Value, RawValue = rawValue.Value };
foreach (var result in results) {
Console.WriteLine($"{result.Value} => {result.RawValue}");
}