Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你怎么能在网页中编辑有效的XML?_C#_Xml_Serialization_Character Encoding - Fatal编程技术网

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

C# 你怎么能在网页中编辑有效的XML?,c#,xml,serialization,character-encoding,C#,Xml,Serialization,Character Encoding,我必须让一个快速而肮脏的配置编辑器启动并运行。流程如下所示: 配置(服务器上的POCO)被序列化为XML。 此时,XML格式良好。配置将发送到XElements中的web服务器。 在web服务器上,XML(是的,全部)被转储到文本区域进行编辑。 用户直接在网页中编辑XML并单击提交。 在响应中,我检索XML配置的修改文本。此时,所有转义都已通过在网页中显示的过程恢复。 我尝试将字符串加载到XML对象(XmlElement、XElement等)中。卡布姆 问题是序列化会转义属性字符串,但在转换过程

我必须让一个快速而肮脏的配置编辑器启动并运行。流程如下所示:

配置(服务器上的POCO)被序列化为XML。
此时,XML格式良好。配置将发送到XElements中的web服务器。
在web服务器上,XML(是的,全部)被转储到文本区域进行编辑。
用户直接在网页中编辑XML并单击提交。
在响应中,我检索XML配置的修改文本。此时,所有转义都已通过在网页中显示的过程恢复。
我尝试将字符串加载到XML对象(XmlElement、XElement等)中。卡布姆

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

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

<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>
这是无效的XML。如果我试图将其加载到任何类型的XML元素中,我都会被落下的铁砧击中。我不喜欢掉铁砧

所以,问题仍然是。。。我能让这个字符串XML准备好解析为XML对象的唯一方法是使用regex替换吗?加载时是否有任何方法“关闭约束”?你怎么避开这个


最后一个回答,然后是这个,因为我认为没有一个有效的答案

我放在textarea中的XML是有效的转义XML。1)将其放入文本区域2)将其发送到客户端3)将其显示到客户端4)提交表单5)将其发送回服务器6)从表单中检索值的过程将删除所有转义

让我再说一遍:我没有逃避任何事情。只需在浏览器中显示它就可以做到这一点

需要深思熟虑的事情:有没有办法从一开始就防止这种无法逃脱的情况发生?有没有一种方法可以获取几乎有效的XML并以安全的方式“清理”它


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

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

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

我可以再次问:如何在文本框中显示XML?您似乎有意在某个时候取消XML的显示

/根据您最近的评论进行编辑:是的,很明显,因为它可以包含HTML。在将XML写入HTML页面之前,需要正确转义XML。我指的是整个XML。因此:

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

这个特殊字符-“正如您所说,正常的序列化程序应该为您转义所有内容

因此,问题在于文本块:您需要自己处理通过文本块传递的任何内容

您可以尝试HttpUtility.HtmlEncode(),但我认为最简单的方法是将通过文本块传递的任何内容封装在CDATA节中

正常情况下,我当然希望所有内容都正确转义,而不是依赖CDATA“拐杖”,但我也希望使用内置工具进行转义。对于用户在“休眠”状态下编辑的内容,我认为CDATA可能是一种方法

另请参见前面的问题:


更新
根据对另一个响应的评论,我意识到您正在向用户显示标记,而不仅仅是内容。Xml解析器非常挑剔。我认为在这种情况下,您最好在接受编辑的Xml之前检查格式是否正确


也许可以尝试自动更正某些类型的错误(例如,我的链接问题中的错误符号),然后从.Net xml解析器中获取第一个验证错误的行号和列号,并使用该行号和列号向用户显示他们的错误所在,直到他们给出可接受的结果。如果还根据架构进行验证,则会获得额外的分数。

这真的是我唯一的选择吗?这不是一个常见的问题,它有解决方案吗框架中的哪个部分

private string EscapeAttributes(string configuration)
{
    var lt = @"(?<=\w+\s*=\s*""[^""]*)<(?=[^""]*"")";
    configuration = Regex.Replace(configuration, lt, "&lt;");

    return configuration;
}
私有字符串转义属性(字符串配置)
{

变量lt=@”(?当然,当你将实体引用放在文本区域内时,它们会被忽略。文本区域并不是神奇的,你必须像其他元素一样&escape;所有你放在其中的东西。浏览器可能会显示一个原始的',你可以看看类似的东西,它允许你在富文本框中编辑html。如果你不能配置它正是你想要的,你可以用它作为灵感。

注意:firefox(在我的测试中)不会像你描述的那样在文本区域中显示。具体来说,以下代码:

<textarea cols="80" rows="10" id="1"></textarea>

<script>
elem = document.getElementById("1");

elem.value = '\
<Configuration>\n\
  <Validator Expression="[^&lt;]" />\n\
</Configuration>\
'
alert(elem.value);
</script>
从正则表达式语法的角度来看,它也不能判断final“是正则表达式的一部分,还是它的结尾。正则表达式语法通常通过显式终止符来解决这个问题,例如:

/[^"<]/

/[^”在所有文本周围插入CDATA将为您提供另一种转义机制,该机制将(1)避免用户手动转义,以及(2)使textarea自动取消转义的文本能够正确读回

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


:-)

为什么,是的,那是对的。然而,问题是如何做到这一点。Regex替换?或者有更安全、更可靠的方法吗?我编辑了我的答案,并添加了一个示例代码来对文本进行编码,然后再将其发送到序列化程序。这会逃避一切,变为有效
HttpServerUtility utility = new HttpServerUtility();
string encodedText = utility.HtmlEncode(text);
private string EscapeAttributes(string configuration)
{
    var lt = @"(?<=\w+\s*=\s*""[^""]*)<(?=[^""]*"")";
    configuration = Regex.Replace(configuration, lt, "&lt;");

    return configuration;
}
<textarea name="somexml">
    &lt;Configuration&gt;
        &lt;Validator Expression="[^&amp;lt;]" /&gt;
        &lt;Validator Expression="[^&amp;amp;]" /&gt;
    &lt;/Configuration&gt;
</textarea>
<textarea cols="80" rows="10" id="1"></textarea>

<script>
elem = document.getElementById("1");

elem.value = '\
<Configuration>\n\
  <Validator Expression="[^&lt;]" />\n\
</Configuration>\
'
alert(elem.value);
</script>
<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>
<Configuration>
  <Validator Expression="[^"<]" />
</Configuration>
/[^"<]/
<Configuration>
  <Expression></Expression></Expression>
</Configuration>
 <Configuration>
   <Validator Expression="<![CDATA[  [^<]   ]]>" />
 </Configuration>