你怎么能在网页上编辑有效的XML?

4 c# xml serialization character-encoding

我必须启动并运行快速而脏的配置编辑器.流程如下:

配置(服务器上的POCO)序列化为XML.
此时XML已经很好地形成了.配置将发送到XElements中的Web服务器.
在Web服务器上,XML(是,所有IT)被转储到textarea中进行编辑.
用户直接在网页中编辑XML并单击"提交".
在响应中,我检索XML配置的更改文本.此时,所有转义都已通过在网页中显示它们的过程恢复.
我尝试将字符串加载到XML对象(XmlElement,XElement,等等).KABOOM.

问题是序列化会转义属性字符串,但在转换过程中会丢失.

例如,假设我有一个具有正则表达式的对象.以下是Web服务器的配置:

<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)

所以,我把它放到textarea中,它对用户来说是这样的:

<Configuration>
  <Validator Expression="[^<]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)

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

<Configuration>
  <Validator Expression="[^<]" />
  <Validator Expression="[^&]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)

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

var result = Server.HttpEncode(editedConfig);

结果是

&lt;Configuration&gt;
  &lt;Validator Expression="[^&lt;]" /&gt;
  &lt;Validator Expression="[^&amp;]" /&gt;
&lt;/Configuration&gt;
Run Code Online (Sandbox Code Playgroud)

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

那么,问题仍然存在......我是否可以通过使用正则表达式替换来获得解析为XML对象的XML字符串的唯一方法?我加载时有没有办法"关闭约束"?你怎么绕过这个?


最后一个回应,然后维基化,因为我认为没有一个有效的答案.

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

让我再说一遍:我不会逃避任何事情.只需在浏览器中显示它就可以了!

需要考虑的事项:有没有办法阻止这种逃避行为的发生?有没有办法采用几乎有效的XML并以安全的方式"清理"它?


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

Kon*_*lph 7

呃......  怎么序列化?通常,XML序列化程序永远不应生成无效的XML.

/编辑回应您的更新:不要显示无效XML到您的用户编辑!而是在TextBox中显示正确转义的XML.修复损坏的XML并不好玩,我实际上没有理由不以有效的转义形式显示/编辑XML.

我再次问:你如何在TextBox中显示XML?您似乎故意在某些时候忽略XML.

/编辑以回应您的最新评论:是的,显然,因为它可以包含HTML.在将XML写入HTML页面之前,您需要正确地转义XML.有了它,我的意思是整个 XML.所以这:

<foo mean-attribute="&lt;">
Run Code Online (Sandbox Code Playgroud)

成为这个:

&lt;foo mean-attribute="&amp;&lt;"&gt;
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 5

当然,当你将实体引用放在textarea中时,它们就会没有转义.Textareas不是魔法,你必须逃避; 你所放入的所有东西就像其他元素一样.浏览器可能会在textarea中显示原始的"<",但这只是因为他们正在尝试清除您的错误.

因此,如果您将可编辑的XML放在textarea中,则需要转义属性值一次以使其成为有效的XML,然后您必须再次转义整个XML以使其成为有效的HTML.您希望在页面中显示的最终来源是:

<textarea name="somexml">
    &lt;Configuration&gt;
        &lt;Validator Expression="[^&amp;lt;]" /&gt;
        &lt;Validator Expression="[^&amp;amp;]" /&gt;
    &lt;/Configuration&gt;
</textarea>
Run Code Online (Sandbox Code Playgroud)

问题是基于对textarea元素的内容模型的误解 - 验证者会立即解决问题.

ETA评论:好吧,还有什么问题?这是序列化方面的问题.剩下的就是将其解析回来,为此你必须假设用户可以创建格式良好的XML.

尝试解析非格式良好的XML,以便允许在属性值中使用"<"或"&"等错误,这是一种损失,完全违背了XML应该如何工作.如果您不能信任您的用户编写格式良好的XML,请为它们提供一个更简单的非XML接口,例如一个简单的换行符分隔的regexp字符串.