在 C# 中从 XML 解析 CData

Parse CData from XML in C#

我正在尝试解析我的 xml,它具有 CData 标记作为其节点之一的值。我的 XML 结构如下。

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

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

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..

我不确定问题是否由 System.XML.Linq.XDocument 引起。所以我尝试了XML文档版本如下。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(responseString);
XmlNode node = xmlDoc.DocumentElement.SelectSingleNode(@"/node1/node2");
XmlNode childNode = node.ChildNodes[0];
if (childNode is XmlCDataSection)
{}

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

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

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

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

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

然后修复了它。

我试过你的代码,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.. 
}

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

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