c# - 你怎么能在网页中编辑有效的 XML?

标签 c# xml serialization character-encoding

我必须启动并运行一个快速而简陋的配置编辑器。流程是这样的:

配置(服务器上的 POCO)被序列化为 XML。
此时 XML 格式正确。配置被发送到 XElements 中的 Web 服务器。
在 Web 服务器上,XML(是的,全部)被转储到文本区域中以供编辑。
用户直接在网页中编辑XML并点击提交。
在响应中,我检索了 XML 配置的更改文本。此时,所有转义都已通过在网页中显示它们的过程恢复。
我尝试将字符串加载到 XML 对象(XmlElement、XElement 等)中。咔嚓。

问题在于序列化会转义属性字符串,但在翻译过程中会丢失。

例如,假设我有一个包含正则表达式的对象。这是 Web 服务器的配置:

<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>

所以,我把它放到一个文本区域中,用户看起来像这样:

<Configuration>
  <Validator Expression="[^<]" />
</Configuration>

因此用户稍作修改并将更改提交回来。在 Web 服务器上,响应字符串如下所示:

<Configuration>
  <Validator Expression="[^<]" />
  <Validator Expression="[^&]" />
</Configuration>

因此,用户添加了另一个验证器,现在两者都具有包含非法字符的属性。如果我尝试将其加载到任何 XML 对象中,它会抛出异常,因为 < 和 & 在文本字符串中无效。我不能不能不能不能不能使用任何类型的编码函数,因为它编码了整个该死的东西:

var result = Server.HttpEncode(editedConfig);

结果

&lt;Configuration&gt;
  &lt;Validator Expression="[^&lt;]" /&gt;
  &lt;Validator Expression="[^&amp;]" /&gt;
&lt;/Configuration&gt;

这不是有效的 XML。如果我尝试将其加载到任何类型的 XML 元素中,我将被落下的铁砧击中。我不喜欢掉落的铁砧。

所以,问题仍然存在......我可以让这个字符串 XML 准备好解析为 XML 对象的唯一方法是使用正则表达式替换吗?加载时有什么方法可以“关闭约束”吗?你如何解决这个问题???


最后一个回复,然后将其维基化,因为我认为没有有效的答案。

我放在文本区域中的 XML 是有效的转义 XML。 1) 将其放入文本区域 2) 将其发送给客户端 3) 将其显示给客户端 4) 提交其所在的表单 5) 将其发送回服务器以及 6) 从表单中检索值的过程 REMOVES任何和所有逃脱。

让我再说一遍:我没有逃避任何事情。只需在浏览器中显示即可!

需要仔细考虑的事情:有没有办法从一开始就防止这种反转义的发生?有没有一种方法可以获取几乎有效的 XML 并以安全的方式“清理”它?


这个问题现在有悬赏。为了收集赏金,您演示了如何在没有第三方/开源工具的情况下在浏览器窗口中编辑 VALID XML,该工具不需要我使用正则表达式手动转义属性值,也不需要用户转义他们的属性,并且在往返时不会失败 (&amp;amp;amp;等;)

最佳答案

呃……如何序列化?通常,XML 序列化程序永远不应生成无效的 XML。

/EDIT 响应您的更新:不要向您的用户显示无效的 XML 以供编辑!相反,在 TextBox 中显示正确转义的 XML。修复损坏的 XML 并不好玩,实际上我认为没有理由不以有效的转义形式显示/编辑 XML。

我又会问:如何在 TextBox 中显示 XML?您似乎在某些时候故意取消转义 XML。

/EDIT 回应您的最新评论:嗯,是的,显然,因为它可以包含 HTML。在将 XML 写出到 HTML 页面之前,您需要正确地转义 XML。我指的是整个 XML。所以这个:

<foo mean-attribute="&lt;">

变成这样:

&lt;foo mean-attribute="&amp;&lt;"&gt;

关于c# - 你怎么能在网页中编辑有效的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/244285/

相关文章:

c# - 为什么 .Net 的 MS 不更开放?

c# - Entity Framework 代码首先未将对象引用设置为对象的实例

c# - 使用 dataset.readxml 在数据表中定义嵌套关系

java - 序列化方法调用是什么意思?

serialization - 戈多/Gdscript : Why is str2var not working on classes with _init method?

c# - 你能说服 DataContext 将列视为总是脏的吗?

c# - visual studio 2010 条件引用

xml - 如何比较 xpath 中的日期以选择节点

xml - 解码 XML 保留子元素

java - 通过网络和字节数组序列化/反序列化Java对象