Java:转义 XML 文本内容而不是整个文本

2023-12-08

我想发送下面的 XML 请求。文本内容应该被转义,但标签不应该被转义。

我试过了使用下面的转义逻辑。
String str = escapeXml11(req);

然而,我的整个请求都被逃脱了。因此,它不再是有效的 XML。

我原来的字符串:

String req =
"<request>\r\n" 
  + " <Products>\r\n" 
    + " <Product>\r\n" 
      + " <ProductName>H < M</ProductName>\r\n" 
      + " <quantity>1</quantity>\r\n" 
      + " <totalProductCost>17.03</totalProductCost>\r\n" 
    + " </Product>\r\n" 
  + " </Products>\r\n" 
+ "</request>"; 

逃脱后:

&lt;request&gt;
    &lt;ProductName&gt;H &lt; M&lt;/ProductName&gt;
    &lt;quantity&gt;1&lt;/quantity&gt;
    &lt;totalProductCost&gt;17.03&lt;/totalProductCost&gt;
&lt;/request&gt

预期结果:

<request>
    <ProductName>H &lt; M</ProductName>
    <quantity>1</quantity>
    <totalProductCost>17.03</totalProductCost>
</request>

如何只转义文本内容?


所以这个问题的根源是第三方提供给你的“XML”格式不正确。

<request>
  <Products>
    <Product>
      <ProductName>H < M</ProductName>
      <quantity>1</quantity>
      <totalProductCost>17.03</totalProductCost>
    </Product>
  </Products> 
</request>

要纠正此问题,您需要将"H < M" to "H &lt; M"。对于人类来说很容易做到这一点,如果人类必须做很多这样的事情,则模精度会出现问题。但实现自动化却很困难。

显然,仅仅调用转义方法是行不通的。如果不解析 XML,转义方法无法确定需要转义的内容。 (像这样的方法escapeXml11仅当整个字符串需要转义时才有效。)

普通的 XML 解析器会看到"< M"尝试将其视为元素标签的开始。然后它会看到下一个"<"...和错误。为了进一步进行,它必须回溯到"< M"并治疗"<" 仿佛逃脱了.

我知道有一种 HTML / XML 解析器 (JSoup) 可以处理错位的情况"<"人物。但是,如果我理解正确,那么对于您的用例来说,它会以错误的方式处理这个问题。而不是治疗"< M"作为数据,它将把它变成一个开始标签:

<request>
  <Products>
    <Product>
      <ProductName>H <M></ProductName>
      <quantity>1</quantity>
      <totalProductCost>17.03</totalProductCost>
    </Product>
  </Products> 
</request>

这给你留下了两种选择:

  • 您可以尝试通过一些模式匹配来检测并修复问题。例如,如果您知道格式错误的数据位于<ProductName>...</ProductName>元素,然后您可以使用正则表达式来搜索这些元素,检查并(如果需要)更正内容,然后替换它。

  • 您可以使用上下文相关的词法分析器为 XML 编写自定义解析器。当解析器看到一个<ProductName>,它将词法分析器切换到处理“的不同模式”<“ 作为数据unless这是开始</ProductName>.


但在您花时间和金钱编写一堆自定义代码来处理这个无效的 XML 之前:

  • 向创建它的第 3 方投诉。他们不应该像这样排放垃圾。他们的软件或数据收集/清理存在缺陷。他们应该修复它。

  • 确保为您支付软件开发和维护费用的人了解这一点。例如,如果您受雇编写一些处理 XML 的软件,那么这不是 XML。如果客户没有警告您您的软件需要处理格式错误的 XML,那么这就是需求的变化,并且可能(应该)是变化合同的。

另请参阅@Michael Kay 的评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:转义 XML 文本内容而不是整个文本 的相关文章

  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 扩展 XSD 文件

    我有一个带有枚举类型的 XSD 文件 我想创建一个 扩展 XSD 文件 它添加一些额外的枚举 但其他方面的行为就像主 XSD 一样 例如 主 XSD 文件包含以下内容
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 如何更新表中的行或插入不存在的行?

    我有以下计数器表 CREATE TABLE cache key text PRIMARY KEY generation int 我想增加其中一个计数器 或者如果相应的行尚不存在 则将其设置为零 有没有办法在标准 SQL 中没有并发问题的情况
  • 标签内的按钮触发(有时是双触发\双击)

    有类似的问题 但我没有足够的声誉来发布答案 所以我将其作为 新问题 问题是
  • dll 的 app.config 中的连接字符串

    我创建了一个 C dll 它使用来自的连接字符串应用程序配置文件连接到数据库 我在 Web 应用程序 Visual Studio 2013 Windows 7 中使用它 该应用程序也连接到数据库并在其中有自己的连接字符串网络配置文件 但是
  • WPF透明边框导致UI停止重绘

    作为后续我之前的问题 我想知道如何正确使用透明窗 如果我将窗口设置为使用透明度 UI 有时会出现停止响应的情况 实际发生的情况是 UI 根本没有按其应有的方式更新 不出现动画 页面似乎无法导航 然而 如果你观察调试器点击按钮 链接等 确实有
  • 你能强制将枚举值序列化为整数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将枚举值序列化为 int Hi all 我想知道是否有一种方法可以强制将枚举值序列化为其整数值 而不是其字符串表示形式 让您了解一下上下文 在严重依赖 Web 服务的 Web 应用程序中 我们为所
  • 不能子类化 UIColor 吗?

    我正在尝试对 UIColor 进行子类化 但我似乎无法弄清楚出了什么问题 在我的 PColor h 中 import
  • 为什么“隔空敲击”手势在我的 Unity/MRTK 应用程序中的 HoloLens1 上不起作用?

    我有一个 Unity 应用程序 我想将其与 Microsoft 混合现实工具包 MRTK 集成 当我将 MRTK v2 1 或 v2 2 包添加到 Unity 项目时 我可以在 Unity 编辑器中模拟 隔空敲击 手势 并且应用程序会注册该
  • 新信号连接到旧插槽而不是单独的插槽

    我正在尝试标记数据跟踪的 x 跨度 并使用 tagNames 起始 x 值和结束 x 值填充表 我正在使用 突出显示 对象的字典来跟踪 x 跨度 以防以后需要对其进行编辑 增加或减少 字典将 x 起始值映射到突出显示对象 因为 x 起始值应
  • 从 Bigquery 中的时间戳提取日期:一种更好的方法

    向 Bigquery 专家提出一个简短的问题 以下是使用标准 SQL 从 Bigquery 中的时间戳中提取日期的两种方法 standardSQL 1 DATE TIMESTAMP MILLIS CAST timestamp AS INT6
  • 当我需要引用自身时如何设计结构[重复]

    这个问题在这里已经有答案了 My 上一个问题告诉我 Rust 不能在结构中引用自身 所以我的问题是 当我需要引用自身时如何设计一个结构体 我们可以以这个结构体为例 struct SplitByChars lt a gt seperator
  • 当用户按下设备音量键时,搜索栏拇指位置发生变化

    我使用搜索栏来控制设备的音量 我只需在触摸板上拖动搜索栏的拇指即可更改设备的音量 但是当用户按下音量 侧面 键时 我需要相应地设置搜索栏拇指位置 我该怎么做 请告诉我 Thanks 我通过重写 onkeydown 事件得到了解决方案 Ove
  • Pygame set_alpha 不适用于尝试的背景淡入淡出

    我一直在尝试创建一个简短的代码 用于可以淡入和从黑色淡出的项目 但由于某种原因 只有淡入功能在工作 而淡出功能或多或少被跳过 通过给他们参数 我确认问题出在第二个函数中 并且透明度根本没有改变 这是我的代码 import pygame sc
  • 未找到带点(IP 地址)的路由,返回 404

    I use Lumen 5 4 这就是我的路线设置方式 app gt get ip ip GeoIpController class show The ip 路由参数应该是一个IP地址 其中带点 然而 当路线中有点时 似乎就会出现问题 它返
  • CharBuffer 位于内存映射的 ByteBuffer 之上,无需使用大量堆空间

    我正在编写一个java代码来在一个大的txt文件 6 8Gb 中搜索电子邮件地址和密码 我已经编写了代码 它可以处理 200Mb txt 文件并给出输出 但是当我输入 500Mb 文件时 它显示以下错误 Exception in threa
  • TensorFlow:“ValueError:没有为任何变量提供梯度”

    我正在张量流中实现 DeepMind 的 DQN 算法 并在我调用的线路上遇到此错误optimizer minimize self loss ValueError No gradients provided for any variable
  • PHP 表单 - 提交时停留在同一页面

    我有一个位于文件中的 PHP 表单contact html 该表格是从文件处理的processForm php 当用户填写表单并单击提交时 processForm php发送电子邮件并引导用户至 processForm php该页面上有一条
  • 将多个 IIS7 重写规则(重定向)合并为一个

    我使用iis7的URL重写模块来完成几件事 301重定向规则从非www到www 301 将规则 info 重定向到 com 已移至我的域的 com 版本 301 从旧页面重定向规则 例如 page name asp 改为 page name
  • Android Facebook 风格幻灯片

    新的 Facebook 应用程序及其导航非常酷 我只是想看看如何在我的应用程序中模拟它 任何人都知道如何实现它 单击左上角按钮后 页面会滑动并显示以下屏幕 Youtube 视频 我自己尝试过这个 我能找到的最好方法是使用 FrameLayo
  • 如何在 ruby​​mine 中停止/终止服务器(开发)

    这里是新手 我在 ruby mine 中创建了一个 Rails 项目来运行公共文件夹中的默认 index html 我按下了 shift F10 键 这与终端的 Rails 服务器相同 这就是我得到的 home bubble rvm rub
  • Java:转义 XML 文本内容而不是整个文本

    我想发送下面的 XML 请求 文本内容应该被转义 但标签不应该被转义 我试过了使用下面的转义逻辑 String str escapeXml11 req 然而 我的整个请求都被逃脱了 因此 它不再是有效的 XML 我原来的字符串 String