【问题标题】:How do I un-escape XML entities easily in .NET如何在 .NET 中轻松取消转义 XML 实体
【发布时间】:2008-10-14 15:30:26
【问题描述】:

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

节点可以只包含一些文本(带有 HTML)或 XML。

例如:

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

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

如果我得到 &lt;XmlNode&gt; 的 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 将返回&lt;dataitem&gt;A test&lt;/dataitem&gt;

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

HTMLDecode 可以做到这一点,但我不确定它是否适用于所有事情。所以问题仍然存在,HTMLDecode 是否会处理所有可能的实体,或者是否有某个类可以为我做这件事。

【问题讨论】:

    标签: .net asp.net xml


    【解决方案1】:

    为什么不将它们插入为 <和> ?您避免将 xml 和自定义标记内容与此混合...

    【讨论】:

    • 这是一个有效的响应,问题中提供的示例不是有效的 XML
    • 我已更新示例以修复不正确的语法。这个答案实际上不是问题的相关答案,但我接受我的例子很糟糕。
    【解决方案2】:

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

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

    编辑

    我想我明白了,但如果我仍然错了,请纠正我。您想从xn1 中提取"&lt;p&gt;A Test&lt;/p&gt;",但从xn2 中提取"A test"

    所以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 的问题,我只是查看了实现,它看起来“适用于所有事情”,但如果您要查找的字符串来自InnerXml,这对我来说似乎是多余的.

    【讨论】:

      【解决方案3】:

      我认为 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.");
              }
      

      这段代码让你的很多隐含假设变得明确,当你遇到不符合你期望形式的数据时,它会告诉你失败的原因。

      【讨论】:

        猜你喜欢
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2011-02-19
        • 2010-11-02
        相关资源
        最近更新 更多