使用Linq获取CDATA XML部分

3

我已经搜索了很多方法来获取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
2个回答

11

尝试使用XDocument.Parse而不是new XDocument

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<string>'转换为'string'。有什么建议吗? - DotNetDude
@DotNetDude,这取决于你的具体代码。我们没有水晶球来看到它,你必须向我们展示它。 - svick
@svick,我已更新代码以反映柯克的想法并最终解决我遇到的错误。你有什么建议吗? - DotNetDude
@DotNetDude 我已经为您更新了答案 - 这是因为 select 返回的是一个集合 (IEnumerable) 而不是单个字符串。请尝试使用更新后的代码。 - Kirk Broadhurst

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();

我希望能够帮助他们


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接