我必须启动并运行快速而脏的配置编辑器.流程如下:
配置(服务器上的POCO)序列化为XML.
此时XML已经很好地形成了.配置将发送到XElements中的Web服务器.
在Web服务器上,XML(是,所有IT)被转储到textarea中进行编辑.
用户直接在网页中编辑XML并单击"提交".
在响应中,我检索XML配置的更改文本.此时,所有转义都已通过在网页中显示它们的过程恢复.
我尝试将字符串加载到XML对象(XmlElement,XElement,等等).KABOOM.
问题是序列化会转义属性字符串,但在转换过程中会丢失.
例如,假设我有一个具有正则表达式的对象.以下是Web服务器的配置:
所以,我把它放到textarea中,它对用户来说是这样的:
因此,用户稍作修改并将更改提交回来.在Web服务器上,响应字符串如下所示:
因此,用户添加了另一个验证器,现在BOTH具有非法字符的属性.如果我尝试将其加载到任何XML对象中,它会抛出异常,因为<和&在文本字符串中无效.我不能不能使用任何类型的编码功能,因为它编码整个血腥的东西:
var result = Server.HttpEncode(editedConfig);
结果是
<Configuration> <Validator Expression="[^<]" /> <Validator Expression="[^&]" /> </Configuration>
这不是有效的XML.如果我尝试将其加载到任何类型的XML元素中,我将会被一个下降的铁砧击中.我不喜欢掉落的铁砧.
那么,问题仍然存在......我是否可以通过使用正则表达式替换来获得解析为XML对象的XML字符串的唯一方法?我加载时有没有办法"关闭约束"?你怎么绕过这个?
最后一个回应,然后维基化,因为我认为没有一个有效的答案.
我在textarea中放置的XML是有效的,转义的XML.1)将其放入文本区域的过程2)将其发送给客户端3)将其显示给客户端4)提交表单,然后将其发送回服务器,以及6)从表格中检索值REMOVES任何和所有逃脱.
让我再说一遍:我不会逃避任何事情.只需在浏览器中显示它就可以了!
需要考虑的事项:有没有办法阻止这种逃避行为的发生?有没有办法采用几乎有效的XML并以安全的方式"清理"它?
这个问题现在有了它的赏金.要收集赏金,您将演示如何在浏览器窗口中编辑VALID XML而不使用第三方/开源工具,该工具不需要我使用正则表达式手动转义属性值,这不需要用户转义其属性,并且在往返时不会失败(& amp; amp; amp; etc;)
呃...... 你怎么序列化?通常,XML序列化程序永远不应生成无效的XML.
/编辑回应您的更新:不要不显示无效XML到您的用户编辑!而是在TextBox中显示正确转义的XML.修复损坏的XML并不好玩,我实际上没有理由不以有效的转义形式显示/编辑XML.
我再次问:你如何在TextBox中显示XML?您似乎故意在某些时候忽略XML.
/编辑以回应您的最新评论:是的,显然,因为它可以包含HTML.在将XML写入HTML页面之前,您需要正确地转义XML.有了它,我的意思是整个 XML.所以这:
成为这个:
<foo mean-attribute="&<">
当然,当你将实体引用放在textarea中时,它们就会没有转义.Textareas不是魔法,你必须逃避; 你所放入的所有东西就像其他元素一样.浏览器可能会在textarea中显示原始的"<",但这只是因为他们正在尝试清除您的错误.
因此,如果您将可编辑的XML放在textarea中,则需要转义属性值一次以使其成为有效的XML,然后您必须再次转义整个XML以使其成为有效的HTML.您希望在页面中显示的最终来源是:
问题是基于对textarea元素的内容模型的误解 - 验证者会立即解决问题.
ETA评论:好吧,还有什么问题?这是序列化方面的问题.剩下的就是将其解析回来,为此你必须假设用户可以创建格式良好的XML.
尝试解析非格式良好的XML,以便允许在属性值中使用"<"或"&"等错误,这是一种损失,完全违背了XML应该如何工作.如果您不能信任您的用户编写格式良好的XML,请为它们提供一个更简单的非XML接口,例如一个简单的换行符分隔的regexp字符串.