获取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' 转换为 '字符串' 。

+0

在上次更新中,queryCDATAXML包含文档中所有CDATA节点的列表。如果你知道只有一个,你可以使用'Single()':'XDocument.Parse(queryCDATAXML.Single())'。 – svick

不是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); 
+0

尝试过但有类型问题 - 参数'1':无法从'System.Collections.Generic.IEnumerable '转换为'string'。有什么建议么? – DotNetDude

+0

@DotNetDude,这取决于你的具体代码。我们没有水晶球看到它,你必须展示给我们。 – svick

+0

@svick,我已经更新了代码,以反映Kirks的想法,最终我收到了错误。有任何想法吗? – DotNetDude