我试图解析我的带有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?请帮助我解决问题。 如果您需要更多详细信息,请告诉我。
答案 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;”被改为"<"
。因此它没有被正确识别为cdatatag。所以必须先做unescape -
XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))
并修复了它。