我必须启动并运行一个快速而简陋的配置编辑器。流程是这样的:
配置(服务器上的 POCO)被序列化为 XML。
此时 XML 格式正确。配置被发送到 XElements 中的 Web 服务器。
在 Web 服务器上,XML(是的,全部)被转储到文本区域中以供编辑。
用户直接在网页中编辑XML并点击提交。
在响应中,我检索了 XML 配置的更改文本。此时,所有转义都已通过在网页中显示它们的过程恢复。
我尝试将字符串加载到 XML 对象(XmlElement、XElement 等)中。咔嚓。
问题在于序列化会转义属性字符串,但在翻译过程中会丢失。
例如,假设我有一个包含正则表达式的对象。这是 Web 服务器的配置:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
所以,我把它放到一个文本区域中,用户看起来像这样:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
因此用户稍作修改并将更改提交回来。在 Web 服务器上,响应字符串如下所示:
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
因此,用户添加了另一个验证器,现在两者都具有包含非法字符的属性。如果我尝试将其加载到任何 XML 对象中,它会抛出异常,因为 < 和 & 在文本字符串中无效。我不能不能不能不能不能使用任何类型的编码函数,因为它编码了整个该死的东西:
var result = Server.HttpEncode(editedConfig);
结果
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
这不是有效的 XML。如果我尝试将其加载到任何类型的 XML 元素中,我将被落下的铁砧击中。我不喜欢掉落的铁砧。
所以,问题仍然存在......我可以让这个字符串 XML 准备好解析为 XML 对象的唯一方法是使用正则表达式替换吗?加载时有什么方法可以“关闭约束”吗?你如何解决这个问题???
最后一个回复,然后将其维基化,因为我认为没有有效的答案。
我放在文本区域中的 XML 是有效的转义 XML。 1) 将其放入文本区域 2) 将其发送给客户端 3) 将其显示给客户端 4) 提交其所在的表单 5) 将其发送回服务器以及 6) 从表单中检索值的过程 REMOVES任何和所有逃脱。
让我再说一遍:我没有逃避任何事情。只需在浏览器中显示即可!
需要仔细考虑的事情:有没有办法从一开始就防止这种反转义的发生?有没有一种方法可以获取几乎有效的 XML 并以安全的方式“清理”它?
这个问题现在有悬赏。为了收集赏金,您演示了如何在没有第三方/开源工具的情况下在浏览器窗口中编辑 VALID XML,该工具不需要我使用正则表达式手动转义属性值,也不需要用户转义他们的属性,并且在往返时不会失败 (&amp;amp;等;)
最佳答案
呃……如何序列化?通常,XML 序列化程序永远不应生成无效的 XML。
/EDIT 响应您的更新:不要向您的用户显示无效的 XML 以供编辑!相反,在 TextBox 中显示正确转义的 XML。修复损坏的 XML 并不好玩,实际上我认为没有理由不以有效的转义形式显示/编辑 XML。
我又会问:如何在 TextBox 中显示 XML?您似乎在某些时候故意取消转义 XML。
/EDIT 回应您的最新评论:嗯,是的,显然,因为它可以包含 HTML。在将 XML 写出到 HTML 页面之前,您需要正确地转义 XML。我指的是整个 XML。所以这个:
<foo mean-attribute="<">
变成这样:
<foo mean-attribute="&<">
关于c# - 你怎么能在网页中编辑有效的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/244285/