我已经搜索了很多方法来获取CDATA部分的文本区域,并发现使用linq的解决方案很平庸。我需要提取嵌入在CDATA节中的XML,以便可以提取不同的信息片段。我有以下XML:
<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' 的参数转换为 'string'。
queryCDATAXML
包含文档中所有 CDATA 节点的列表。如果您知道只有一个,可以使用Single()
:XDocument.Parse(queryCDATAXML.Single())
。 - svick