使用Linq获取CDATA XML部分

时间:2011-10-01 13:13:05

标签: c# xml linq

我一直在寻找获取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'。

2 个答案:

答案 0 :(得分:9)

而不是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 :(得分:0)

我以这种形式解决了此案:

XDocument xdoc = XDocument.Parse(vm.Xml);

XNamespace cbc = @"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";
  var list2 =
       (from el in xdoc.Descendants(cbc + "Description")
        select el).FirstOrDefault();

      var queryCDATAXML = (from eel in list2.DescendantNodes()                                                
      select eel.Parent.Value.Trim()).FirstOrDefault();

希望对他们有帮助