获取CDATA XML部分使用Linq
我搜索了四处寻找方法来获取CDATA部分文本区域,并发现使用linq很温暖的解决方案。我需要提取嵌入在CDATA部分中的XML,以便我可以提取不同的信息。我有以下XML:获取CDATA XML部分使用Linq
<Envelope>
<Warehouse />
<Payload>
- <![CDATA[
<?xml version="1.0"?>
<ROOT>
<ORDERID>399798</ORDERID>
<PRODUCTNUMBER>00003997</PRODUCTNUMBER>
<DESCIPTION>Red Rider BB-Gun</DESCIPTION>
<STATUS>InStock</STATUS>
<LOCATION>Chicago</LOCATION>
</ROOT> ]]>
</Payload>
</Envelope>
所以我想如果可能的话,通过提取整个CDATA节到一个XDocument,所以我可以使用LINQ查询来做到这一点。另外如果我只是想从CData部分提取一个元素。我怎样才能做到这一点?使用Linq?
我已经尝试使用下面的Linq代码给我回cdata部分,但不能做任何事情,因为它作为一个IEnumerable回来。我可能错过了一些简单的东西,所以我来找你Linq向导寻求帮助。
这是我提到的代码:
var queryCDATAXML = from el in xdoc.DescendantNodes()
where el.NodeType == XmlNodeType.CDATA
select el.Parent.Value.Trim();
有没有办法做一个选择新的XDocument或XmlDocument的,像这样:
//This doesn't compile.
var queryCDATAXML = from el in xdoc.DescendantNodes()
where el.NodeType == XmlNodeType.CDATA
select new XDocument()
{
el.Parent.Value.Trim();
}
如果我要对此都错了或他们是一个更好的方法来实现这一点,我愿意提出建议。 :)
感谢, DND
代码更新:
var queryCDATAXML = from el in xdoc.DescendantNodes()
where el.NodeType == XmlNodeType.CDATA
select el.Parent.Value.Trim();
var xdoc = XDocument.Parse(queryCDATAXML);
生成此错误: 参数 '1':无法从 'System.Collections.Generic.IEnumerable' 转换为 '字符串' 。
不是new XDocument
,尝试XDocument.Parse
var queryCDATAXML = // get the value
var xdoc = XDocument.Parse(queryCDATAXML);
你得到一些Enumerable<string>
而非string
,所以你需要刚才得到的一个值。
var node = xdoc.DescendantNodes().Single(el => el.NodeType == XmlNodeType.CDATA);
var content = node.Parent.Value.Trim();
var xdoc = XDocument.Parse(content);
尝试过但有类型问题 - 参数'1':无法从'System.Collections.Generic.IEnumerable
@DotNetDude,这取决于你的具体代码。我们没有水晶球看到它,你必须展示给我们。 – svick
@svick,我已经更新了代码,以反映Kirks的想法,最终我收到了错误。有任何想法吗? – DotNetDude
在上次更新中,queryCDATAXML包含文档中所有CDATA节点的列表。如果你知道只有一个,你可以使用'Single()':'XDocument.Parse(queryCDATAXML.Single())'。 – svick