【问题标题】:Handle "XML" with incorrectly encoded HTML entities [duplicate]使用错误编码的 HTML 实体处理“XML”[重复]
【发布时间】:2020-01-04 01:21:53
【问题描述】:

我有一个 XML 文件,用户可以更改该文件并将一些不同的文本添加到某些属性,然后上传到我的工具。问题是它们有时在属性值中包含<>。我想把它改成<>

例如:

 <title value="Tuition and fees paid with (Percent<5000) by Gender" />

使用以下代码加载它会导致错误:

XmlDocument smldoc = new XmlDocument();
xmldoc.LoadXml(xmlString);

我遇到的问题是我需要用户生成的所有属性都位于&amp;lt;&amp;gt; 的html 实体中。问题是我不能只做一个.Replace("&lt;", "&amp;lt;"),因为实际的 XML 文件需要这些。

这如何轻松完成?代码是 C#.Net。

【问题讨论】:

  • 这不是有效的 XML,您可以验证用户输入并让用户知道它无效,但解析器无能为力。
  • 您不应允许用户编辑 XML(除非他们也是开发人员)。提供用于编辑内容的工具,这样他们就不会触及 XML 结构。 .xlsx 文档是压缩的 XML 文件,但 Microsoft 不希望用户直接编辑 XML 来更改单元格内容。
  • stackoverflow.com/questions/44765194/… 重复涵盖了您问题的“已读”部分(最初是 Java,但涵盖的策略是通用的,还包括一些特定于 .NET 的内容)。正如@madreflection 指出的那样,让用户编辑 XML 通常是个坏主意(我知道也许有几个人每次都能正确地手动编码......但其他没有直接或间接参与 XML W3C 委员会的人经常犯错误足够的)。如果您必须进行纯文本编辑,请使用单独的文件...

标签: c# asp.net .net xml c#-4.0


【解决方案1】:

为什么您首先允许您的用户向您发送无效的 XML?你应该拒绝这样的输入。没有更适合您的用户发送此数据的格式吗?像“键:值”字符串列表?

无论如何,您都可以通过替换方法解决此问题,只需确保您在第一个之后开始并在最后一个 &lt;&gt; 之前停止。

类似这样的:

var trimmedXml = xmlString.Trim(); // to remove whitespace at either end

var innerText = trimmedXml.Substring(1, trimmedXml.Length -1);
innerText = innerText.Replace("<", "&lt").Replace(">", "&gt;");

xmlString = trimmedXml[0] + innerText + trimmedXml[trimmedXml.Length -1];

当然,您需要验证“XML”字符串至少包含&lt;/&gt;

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2013-04-20
    • 2014-01-15
    • 2011-08-13
    相关资源
    最近更新 更多