【问题标题】:Getting CDATA XML Section Using Linq使用 Linq 获取 CDATA XML 部分
【发布时间】: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())

标签: c# xml linq


【解决方案1】:

而不是new XDocument,试试XDocument.Parse

var queryCDATAXML = // get the value
var xdoc = XDocument.Parse(queryCDATAXML);

你得到一些Enumerable&lt;string&gt;而不是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'。有什么建议吗?
  • @DotNetDude,这取决于您的特定代码。我们没有水晶球可以看到,你必须给我们看。
  • @svick,我已经更新了代码以反映 Kirks 的想法,并最终反映了我收到的错误。有什么想法吗?
  • @DotNetDude 我已经为您更新了我的答案 - 这是因为 select 返回一个集合(IEnumerable)而不是单个字符串。试试更新的代码。
【解决方案2】:

我以这种形式解决了这个案例:

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

希望能帮到他们

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多