C#解析对数组的XML响应

时间:2017-11-16 00:46:28

标签: c# xml

我正在使用返回以下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,所以我不能像额外的节点名称那样有用

1 个答案:

答案 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}");
}