在 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。所以“<”被更改为 "<"
。因此它没有被正确识别为 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();
我正在尝试解析我的 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。所以“<”被更改为 "<"
。因此它没有被正确识别为 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();