2016-08-18 282 views
-1

我试图解析我的xml,它有一个CData标记作为其节点的值。我的XML结构如下。从C#中解析XML中的CData

<node1> 
<node2> 
<![CDATA[ <[email protected]@@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[ <[email protected]@@BREAK TYPE="TABLE" @@@--> <P><CENTER>... html goes here.. ]]> 

Expected Output: <[email protected]@@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?请帮我解决这个问题。 请让我知道你是否需要更多的细节。

+0

是否有理由解答此问题?我试图确保我提供所有必要的信息。 – csharpnewbie

回答

-1

这是因为StreamReader是转义的HTML。所以“<”变为"&lt;"。因此它不能被正确识别为cdatatag。所以不得不先做unescape - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))

并且修复了它。

3

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

你可以得到实际的cdata节点的唯一方法是,如果你实际上得到了cdata节点。

​​3210
+0

但是,这是输出,我不知道如果我错过了明显的东西。因此我想在这里与同行进行核对。我知道我应该得到cdata的内容,但我不知道。 – csharpnewbie

+0

首先,尝试重现问题而不从某些响应中获取数据。使用该响应的内容创建一个字符串,并在单独的程序中通过代码运行该字符串。你不会得到你所说的话。如果你以某种方式做,那么这意味着你的输入字符串是_not_你在这里发布的内容。发布该字符串,如果它符合你说的话。 –

+0

带字符串的独立控制台程序工作得非常好,并按预期生成结果 - 只是cdata标记内的文本。但是当我用服务器的响应运行我的实际代码时,它不能正常工作。 – csharpnewbie

0

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

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

static void Main(string[] args) 
{ 
    string responseString = "<node1>" + 
          "<node2>" + 
          "<![CDATA[ <[email protected]@@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: <[email protected]@@BREAK TYPE=\"TABLE\" @@@--> <P><CENTER>... html goes here.. 
} 
+0

@MarxKlaxx,这是因为StreamReader正在转义html。所以“<”变成了“<”。所以不得不先做unescape - XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))并修复它。 – csharpnewbie