在C#中从XML解析CData

时间:2016-08-18 21:32:44

标签: linq c#-4.0 cdata

我试图解析我的带有CData标记的xml作为其中一个节点的值。我的XML结构如下所示。

2^n

我的代码如下。当我解析时,我得到CData标签的响应,而不是CData标签中的值。你能帮我修一下我的问题吗?

<node1>
<node2>
<![CDATA[ <!--@@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. ]]>
</node2>
</node1>

我不确定System.XML.Linq.XDocument是否导致了问题。所以我尝试了如下的XMLDocument版本。

XDocument xmlDoc = XDocument.Parse(responseString);
XElement node1Element = xmlDoc.Descendants("node1").FirstOrDefault();
string cdataValue = node1Element.Element("node2").Value;

Actual Output: <![CDATA[ <!--@@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. ]]>

Expected Output:  <!--@@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here..

我的if循环返回false。所以看起来我的xml有问题,它实际上不是一个有效的CData?请帮助我解决问题。 如果您需要更多详细信息,请告诉我。

4 个答案:

答案 0 :(得分:3)

你所描述的内容永远不会发生。获取包含Value作为子项的节点的cdata将为您提供内部文本cdata的内容。您应该已经获得了预期的输出。

获得实际cdata节点的唯一方法是实际获得cdata节点。

var cdata = node1Element.Element("node2").FirstNode;

答案 1 :(得分:0)

我尝试了你的代码,CData值是正确的......?!?

你如何填写你的reponseString? : - )

static void Main(string[] args)
{
  string responseString = "<node1>" +
                          "<node2>" +
                          "<![CDATA[ <!--@@@BREAK TYPE=\"TABLE\" @@@--> <P><CENTER>... html goes here.. ]]>" +
                          "</node2>" +
                          "</node1>";

  XDocument xmlDoc = XDocument.Parse(responseString);
  XElement node1Element = xmlDoc.Descendants("node1").FirstOrDefault();
  string cdataValue = node1Element.Element("node2").Value;

  // output:  <!--@@@BREAK TYPE=\"TABLE\" @@@--> <P><CENTER>... html goes here.. 
}

答案 2 :(得分: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();

答案 3 :(得分:-1)

这是因为StreamReader正在逃避html。所以“&lt;”被改为"&lt;"。因此它没有被正确识别为cdatatag。所以必须先做unescape - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

并修复了它。