我一直在寻找获取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'。
答案 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();
希望对他们有帮助