如何在.NET中轻松取消XML实体的转义

时间:2008-10-14 15:30:26

标签: .net asp.net xml

我有一些代码可以为XMLNode返回InnerXML。

该节点只能包含一些文本(使用HTML)或XML。

例如:

<XMLNode>
    Here is some &lt;strong&gt;HTML&lt;/strong&gt;
<XMLNode>

<XMLNode>
    <XMLContent>Here is some content</XMLContnet>
</XMLNode>

如果我获得<XmlNode>的InnerXML,HTML标记将作为XML实体返回。

我无法使用InnerText,因为我需要能够获取XML内容。所以我真正需要的是一种解除HTML标签的方法,因为我可以检测它是否是XML,并采取相应的行动。

我想我可以使用HTMLDecode,但这会解码所有XML编码的实体吗?

更新:我想我有点夸张,所以这里有一个澄清的场景:

我有一个XML文档,如下所示:

<content id="1">
    <data>&lt;p&gt;A Test&lt;/p&gt;</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将返回

 &lt;p&gt;A Test&lt;/p&gt;

xn2将返回<dataitem>A test</dataitem>

我已经在检查返回的内容是否是XML(在xn2的情况下)所以我需要做的就是取消xn1中的&lt;等。

HTMLDecode这样做,但我不确定它是否适用于所有内容。所以问题仍然存在,HTMLDecode将处理所有可能的实体,或者是否有一个类可以为我做这个。

3 个答案:

答案 0 :(得分:2)

为什么不将它们插入&amp; lt;和&amp; gt; ?你不要把xml和自定义标记的东西混合起来......

答案 1 :(得分:2)

你的问题有点难以理解。以下是我不完全理解的事情:

  1. 如果您使用的是XmlNode / XmlElement对象,那么您正在使用XML而不是HTML。所以你可以拥有的只是XML元素。这些可能包含HTML元素名称,但它们 XML。
  2. InnerXml返回一个字符串,至少对于XmlElement对象。你在忙什么工作?
  3. 您希望从操作中获得哪些数据?你能举例说明你的需求吗?
  4. 当您拥有数据时,您打算如何处理数据?也许有一个更好的方法来实现你的目标而不是想到的东西?

  5. 修改

    我想我得到的照片,但如果我还是错的话,请纠正我。您想从"<p>A Test</p>"中取出xn1,而在"A test"中取出xn2

    所以InnerXmlxn1的方式,而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.");
        }

这段代码使你的许多隐含假设明确,​​当你遇到的数据不是你期望的形式时,它会告诉你它失败的原因。