草庐IT

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

coder 2024-06-26 原文

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

配置(服务器上的 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# - 你怎么能在网页中编辑有效的 XML?的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

  8. ruby-on-rails - 我该怎么办 :remote location validation with CarrierWave? - 2

    我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC

  9. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐