使用 & 符号解析 XML

2024-01-26

我有一个包含 XML 的字符串,我只想将其解析为 Xelement,但它有一个&符号。我在使用 HtmlDecode 解析它时仍然遇到问题。有什么建议么?

string test = " <MyXML><SubXML><XmlEntry Element="test" value="wow&" /></SubXML></MyXML>"; 

XElement.Parse(HttpUtility.HtmlDecode(test));

我还添加了这些方法来替换这些字符,但我仍然收到 XMLException。

string encodedXml = test.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");
XElement myXML = XElement.Parse(encodedXml);

t 或者甚至尝试过这个:

string newContent=  SecurityElement.Escape(test);
XElement myXML = XElement.Parse(newContent);

理想情况下,XML 在您的代码使用它之前已正确转义。如果这超出了您的控制范围,您可以编写正则表达式。除非您完全确定这些值不包含其他转义项,否则请勿使用 String.Replace 方法。

例如,"wow&amp;".Replace("&", "&amp;")结果是wow&amp;amp;这显然是不可取的。

Regex.Replace 可以为您提供更多控制来避免这种情况,并且可以编写为仅匹配不属于其他字符的“&”符号,例如&lt;, 就像是:

string result = Regex.Replace(test, "&(?!(amp|apos|quot|lt|gt);)", "&amp;");

上面的方法有效,但不可否认,它没有涵盖以 & 开头的各种其他字符,例如&nbsp;而且这个名单还会继续增长。

更灵活的方法是解码 value 属性的内容,然后重新编码。如果你有value="&wow&amp;"解码过程将返回"&wow&"然后重新编码它会返回"&amp;wow&amp;",这是理想的。要实现这一点,你可以使用这个:

string result = Regex.Replace(test, @"value=\""(.*?)\""", m => "value=\"" +
    HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(m.Groups[1].Value)) +
    "\"");
var doc = XElement.Parse(result);

请记住,上述正则表达式仅针对 value 属性的内容。如果 XML 结构中的其他区域遇到相同的问题,则可以对其进行调整以匹配它们并以类似的方式替换其内容。


EDIT: updated solution that should handle content between tags as well as anything between double quotes. Be sure to test this thoroughly. Attempting to manipulate XML/HTML tags with regex is not favorable as it can be error prone and over-complicated. Your case is somewhat special since you need to sanitize it first in order to make use of it.
string pattern = "(?<start>>)(?<content>.+?(?<!>))(?<end><)|(?<start>\")(?<content>.+?)(?<end>\")";
string result = Regex.Replace(test, pattern, m =>
            m.Groups["start"].Value +
            HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(m.Groups["content"].Value)) +
            m.Groups["end"].Value);
var doc = XElement.Parse(result);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 & 符号解析 XML 的相关文章

随机推荐

  • 包含子模块的“推送部署”接收后挂钩?

    目前 我有一个post receive钩子包含 git work tree served data location git dir this bare git repo checkout f 这非常有效 直到我想包含一个子模块 它只是忽略
  • Python os.walk + 跟随符号链接

    如何让这篇文章遵循 python 2 6 中的符号链接 def load recursive self path for subdir dirs files in os walk path for file in files if file
  • 优化掉“while(1);”在 C++0x 中

    已更新 请看下文 我听说并读到 C 0x 允许编译器为以下代码片段打印 Hello include
  • 这会在全球范围内启用“use strict”吗?

    类似 但不一样 如何在全局范围内启用 ECMAScript use strict https stackoverflow com questions 4769477 how to enable ecmascript use strict g
  • 使用安装项目在安装时指定 Windows 服务名称

    目标 为了支持在一台计算机上可能有多个实例的 Windows 服务 请使用安装项目创建一个能够执行以下操作的 MSI 接收用户输入的服务名称 安装服务 从 1 开始序列化服务名称 以便在日志记录和卸载时可以使用正确的名称 我最初的希望是在
  • JS/Es6 如何合并两个数组并覆盖其对象中的值

    假设我有一个像这样的数组 let arrayOne text one value 0 text two value 0 let arrayTwo text two value 5 So arrayOne总是我想要的整个对象集 但所有值都将为
  • Selenium Chrome 窗口中的按钮不可点击

    我正在尝试使用 Selenium 和 Python 单击按钮 我需要理解的这个问题的根源是 当 Selenium 启动 Chrome 窗口时 我想单击的按钮在单击时不会执行任何操作 就像我用鼠标点击按钮一样 什么也不会发生 它似乎是页面上唯
  • 如何将 bash 输出捕获到 Mac OS X 剪贴板?

    是否可以将 bash 输出捕获到 OS X 剪贴板 The pbcopy http developer apple com Mac library documentation Darwin Reference ManPages man1 p
  • OpenJDK7 OS X 上的 file.listFiles() 在包含欧元符号的文件名上损坏

    似乎以下 file listFiles 在 OS X 上的 OpenJDK 7 上被破坏 此代码片段将打印 此文件有欧元符号 不存在 final String pathname System getProperty user home fo
  • 检查 Android/Java 上的端口是否打开

    我想检查端口是否打开 或者服务器是否正在其上运行 我已经以多种方式尝试过 例如 system bin ping 和 InetAddress 但如果我是对的 我无法使用这些 ping 特定端口 这次我用 DatagramSockets 的想法
  • 显示软键盘时出现对话框

    我有一个扩展的类Dialog 在那里面Dialog我有一个EditText and a ListView 当该对话框显示时 我可以调出软键盘 但我的问题是我们可以让对话框在显示软键盘时不弹出吗 我尝试改变softInputMode在布局参数
  • 使用 Mathematica 7 调试 Mathematica 5 上的工作程序

    我目前正在阅读 Mathematica 编程指南 并试图编写这本书的第一个程序 基本上 当我运行以下程序时 Plot3D Re Exp 1 x I y x 0 02 0 022 y 0 04 0 042 PlotRange gt 1 8 P
  • 如何使用 gradle 0.7+ 将 .so 文件添加到 android 库项目

    项目结构 应用程序项目 gt 取决于库项目 图书馆计划 有一个用于编译 jni 库的文件夹 jniLibs srcDirs libs 我尝试按照示例应用程序将以下内容添加到 build gradle 的 android 元素中https a
  • 在 JQuery 中获取 Node 的原始 HTML

    我用过 parent html 获取内部 html parent 但是我如何获取父级本身的 html 呢 用例是 我获取一个像这样的输入节点 var field input 我希望能够获取该节点的原始 html
  • 用户存在和身份验证

    我正在使用此代码使用服务在后台检测我的 Android 应用程序中的用户存在 final FirebaseAuth mAuth FirebaseAuth getInstance final FirebaseDatabase database
  • 动态规划和分而治之

    我正在读书动态规划的笔记 http www es ele tue nl education 5MC10 Solutions knapsack pdf 我遇到了以下评论 如果子问题不是独立的 即 子问题共享子子问题 然后分而治之算法重复解决公
  • Android 获取屏幕宽度和高度

    如何获取屏幕宽度和高度并在以下位置使用该值 Override protected void onMeasure int widthSpecId int heightSpecId Log e TAG onMeasure widthSpecId
  • 将分隔的字段合并为一个

    我在 Ada 工作 我有一个非常丑陋的类型 我无法修改 我想做一些易于使用的事情 类型是这样的 for T Ugly Type Alignment use 4 for T Ugly Type Size use 48 for T Ugly T
  • 比 SHA1 更好的散列

    我正在开发一个应用程序 我需要存储用户密码 所以我想将其存储在注册表的当前用户类中 但出于显而易见的原因我也想对其进行哈希处理 并且我我看到新闻报道称 SHA1 已被破解 标准 系统或 net 中是否有更好的 未破解的 哈希算法 SHA1
  • 使用 & 符号解析 XML

    我有一个包含 XML 的字符串 我只想将其解析为 Xelement 但它有一个 符号 我在使用 HtmlDecode 解析它时仍然遇到问题 有什么建议么 string test