【发布时间】:2011-10-01 13:13:05
【问题描述】:
我四处寻找进入 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();
}
如果我对这一切都错了,或者他们是实现这一目标的更好方法,我愿意接受建议。 :)
谢谢, 免打扰
代码更新:
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”转换为“字符串”。
【问题讨论】:
-
在上次更新中,
queryCDATAXML包含文档中所有 CDATA 节点的列表。如果你知道只有一个,你可以使用Single():XDocument.Parse(queryCDATAXML.Single())。