在c#中从XML解析CData



我试图解析我的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导致了这个问题。所以我尝试了如下的XMLDocument版本。

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

if循环返回false。所以看起来我的xml有问题,它实际上不是一个有效的CData?请帮我解决这个问题。

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

您可以获得实际的cdata节点的唯一方法是如果您实际获得cdata节点。

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

我试过你的代码和CData值是正确的…?!?

如何填写你的responsestring ?: -)

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

这是因为StreamReader正在转义html。所以"<"被改成了"&lt;"。因此,它没有被正确地识别为候选标签。所以不得不先做不可逃避的事XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

修复了它。

最新更新