我有一些代码可以为XMLNode返回InnerXML。
该节点只能包含一些文本(使用HTML)或XML。
例如:
<XMLNode>
Here is some <strong>HTML</strong>
<XMLNode>
或
<XMLNode>
<XMLContent>Here is some content</XMLContnet>
</XMLNode>
如果我获得<XmlNode>
的InnerXML,HTML标记将作为XML实体返回。
我无法使用InnerText,因为我需要能够获取XML内容。所以我真正需要的是一种解除HTML标签的方法,因为我可以检测它是否是XML,并采取相应的行动。
我想我可以使用HTMLDecode,但这会解码所有XML编码的实体吗?
更新:我想我有点夸张,所以这里有一个澄清的场景:
我有一个XML文档,如下所示:
<content id="1">
<data><p>A Test</p></data>
</content id="2">
<content>
<data>
<dataitem>A test</dataitem>
</data>
</content>
如果我这样做:
XmlNode xn1 = document.SelectSingleNode("/content[@id=1]/data");
XmlNode xn2 = document.SelectSingleNode("/content[@id=2]/data");
Console.WriteLine(xn1.InnerXml);
Console.WriteLine(xn2.InnerXml);
xn1将返回
<p>A Test</p>
xn2将返回<dataitem>A test</dataitem>
我已经在检查返回的内容是否是XML(在xn2的情况下)所以我需要做的就是取消xn1中的<
等。
HTMLDecode这样做,但我不确定它是否适用于所有内容。所以问题仍然存在,HTMLDecode将处理所有可能的实体,或者是否有一个类可以为我做这个。
答案 0 :(得分:2)
为什么不将它们插入&amp; lt;和&amp; gt; ?你不要把xml和自定义标记的东西混合起来......
答案 1 :(得分:2)
你的问题有点难以理解。以下是我不完全理解的事情:
修改强>
我想我得到的照片,但如果我还是错的话,请纠正我。您想从"<p>A Test</p>"
中取出xn1
,而在"A test"
中取出xn2
。
所以InnerXml
是xn1
的方式,而InnerText
适合xn2
。
那么这样做 - 测试dataitem
的存在并决定你知道该怎么做。
XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");
if (xn.SelectSingleNode("dataitem") == null)
Console.WriteLine(xn.InnerXml);
else
Console.WriteLine(xn.InnerText);
要回答关于HttpUtility.HtmlDecode
的问题,我只是看了一下实现,它看起来会“适用于所有事情”,但如果您要查找的字符串来自{{}},那么对我来说似乎是多余的。 {1}}。
答案 2 :(得分:1)
我认为Tomalak走在正确的轨道上,但我的代码编写方式略有不同:
XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");
if (xn.ChildNodes.Count != 1)
{
throw new InvalidOperationException("I don't know what to do if there's not exactly one child node.");
}
XmlNode child = xn.ChildNodes[0];
switch (child.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine(xn.InnerXml);
break;
case XmlNodeType.Text:
Console.WriteLine(xn.Value);
break;
default:
throw new InvalidOperationException("I can only handle elements and text nodes.");
}
这段代码使你的许多隐含假设明确,当你遇到的数据不是你期望的形式时,它会告诉你它失败的原因。