我试图解析我的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。所以"<"被改成了"<"
。因此,它没有被正确地识别为候选标签。所以不得不先做不可逃避的事XDocument xmlDoc = XDocument.Parse(HttpUtility.HtmlDecode(responseString))
修复了它。