【问题标题】:Replace >, <, & chars that appear inside XML nodes替换出现在 XML 节点中的 >、< 和 & 字符
【发布时间】:2011-04-12 20:22:39
【问题描述】:

Regular expression to match ">", "<", "&" chars that appear inside XML nodes

对此我有一个几乎相同的问题 - 但是,我使用的是 C#。

我不是在这里争论 XML 的有效性。

发送进来的东西不在我的控制范围内。

输入 XML:

<PNODE> 
  <CNODE>This string contains > and < and & chars.</cnode> 
</PNODE> 

我需要它看起来像这样:

<PNODE> 
  <CNODE>This string contains &gt; and &lt and &amp; chars.</CNODE> 
</PNODE> 

看起来这家伙找到了 PHP 的解决方案——这对我没有帮助。

但是,我需要找到一种方法来转义节点内的 &、> 和

【问题讨论】:

  • 此外 - 由于似乎存在一些混淆:replace、htmlencode、securityelement.escape、xmltextwriter 等 - 这些常用方法都不起作用,因为它们也替换了节点声明标记。跨度>

标签: c# xml


【解决方案1】:

查看Tidy.Net。这是 Tidy 的 .Net 实现。

【讨论】:

  • 虽然我确信我可以找到一个 .Net Tidy 解决方案,但它有望奏效 - 是否有另一种不需要 Tidy 库或任何其他第三方添加的方法来做到这一点?
  • 您可以构建自己的实现。这种格式不正确的 XML 不会加载到 XmlDocument 中,因此您必须将其作为字符串加载,并自动执行一个过程来确定哪些项目应该被替换,哪些是文档的有效部分。理论上,任何 & 都可以被替换,任何 > 前面没有 <PNODE><CNODE>This string contains <AND> and & chars.</CNODE></PNODE> 其中&lt;AND&gt; 将被遗漏。从那你可能会发现 没有关闭......
  • 简单地说,我不会尝试重新发明轮子。
【解决方案2】:

【讨论】:

  • 虽然我确信我可以找到一个 .Net Tidy 解决方案,但它有望奏效 - 是否有另一种不需要 Tidy 库或任何其他第三方添加的方法来做到这一点?
  • 正如@md5sum 所述,虽然可以自己完成,但为什么要重新发明轮子。您是否有不能使用 3rd 方库/解决方案的基本要求?特别喜欢 Tidy .Net,因为它是开源的?
【解决方案3】:

使用 HTTPUtility。

HttpUtility.HtmlEncode("<text to Encode>");

【讨论】:

  • 这会破坏&lt;foo&gt;&lt;bar&gt;uh oh bad &gt; &lt; &amp; characters&lt;/bar&gt;&lt;/foo&gt;;他需要修复坏字符而不损坏&lt;foo&gt;&lt;bar&gt;
【解决方案4】:

你应该看看 SgmlReader:

http://developer.mindtouch.com/SgmlReader

它会给你你想要的 :) 我在这里使用它:http://www.xmltools.dk/HtmlToXml 试试看 :) (你可以禁用 html 标签和大写标签->小写标签转换。)

【讨论】:

    【解决方案5】:

    我一直只对 XML 使用 replace(我不必引入 HTTP 库):

    string output = inputXml.Replace("&", "&amp;")
                            .Replace("<", "&lt;")
                            .Replace(">", "&tg;")
                            .Replace("'", "&apos;")     // optional
                            .Replace("\"", "&Quot;")    // optional
    

    【讨论】:

    • 如果他打算这样做,他可能应该只使用HTTPUtility.HtmlEncode,但已经确定这不起作用......
    • 但这也会影响您的节点。我错过了你问题的那一部分。
    • inputXml 是 整个 xml。这将替换完美的 XML 以及内容中不需要的字符。
    【解决方案6】:

    我不是在这里争论 XML。

    that other question 一样,正确 的答案是您收到的不是 XML。这是一个格式正确的问题,而不是 XML 意义上的有效性问题。

    发送进来的东西是我无法控制的。

    这可能是真的,但如果有人寄给您一夸脱用过的机油并要求您将其转换为 HTML,您还会接受吗?通常数据交换是根据合同(正式或非正式)完成的,交换的数据将遵守某些标准。如果它不符合商定的标准,数据可以被退回,被拒绝。

    如果您不需要 XML 作为输入,那么这个问题与“出现在 XML 节点中的

    正如其他人所说,要做到这一点,.NET Tidy 和 SGMLReader 是很好的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多