Java中如何替换XML属性中的特殊字符并保持XML结构

agxfikkp  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(330)

下面是我收到的XML示例,我需要替换属性中的一些特殊字符并将其发送(xmlString.replaceAll("\[^A-Za-z0-9#&',-.\]", "")),请参考最后一个属性示例
有没有一种方法可以迭代每个节点(XML属性/节点名称不是固定的),然后只对属性的值部分应用正则表达式并重新构建XML?
转换为字符串并应用正则表达式并不总是有效
对Java中的任何方法都开放。

<AccountNumberId>JY00000830</AccountNumberId>
<XYZ:CompanyCd>DOC</XYZ:CompanyCd>
<XYZ:MultiPolicyDiscountCd>0</XYZ:MultiPolicyDiscountCd>
<QuestionAnswer>
<QuestionCd>XYZ:1</QuestionCd>
<YesNoCd>No</YesNoCd>
</QuestionAnswer>
<TransactionSeqNumber/>
<PersApplicationInfo>
<ApplicationWrittenDt>2023-02-26</ApplicationWrittenDt>
<KnownSinceDt>2007-02-05</KnownSinceDt>
</PersApplicationInfo>
<XYZ:TaxExemptionInd>0</XYZ:TaxExemptionInd>
</PersPolicy>
<Location id="LOC-1">
<ItemIdInfo>
<XYZ:FixedId>8001</XYZ:FixedId>
</ItemIdInfo>
<Addr>
<Addr1>`**`1234 $$$RIVERWOOD !!<GATE SUITE> 136`**`</Addr1>
...
var escapedXml = StringEscapeUtils.escapeXml(xmlString);
var replaceSplChars = escapedXml
  .replaceAll("[^A-Za-z0-9#&',-.\n</>]", "")
  .replace("\t", "");
var toXML = StringEscapeUtils.unescapeXml(replaceSplChars);

上面的方法没有帮助,因为xml结构具有类似"〈XYZ:"的属性,我最终删除了":"

toe95027

toe950271#

replaceAll的第一个参数是正则表达式模式。“regular expression”中的“regular”引用整个语法类。要点是:

  • 如果一个语法不是正则的,那么正则表达式不能用于读取/修改用该语法编写的任何内容!*

而且XML * 不是常规的 *。因此,你根本不能这样做。无论你想用什么正则表达式,我都可以创建有效的XML,它满足任何你的正则表达式不能正确解析或修改的基于XML的规范。
解决方案包括以下两个选项之一:
1.使用实际的XML解析器读取此数据。Here is a tutorial that covers all the popular ones
1.修改代码的用途。不要使用“读入一些XML并对其进行这些修改”,这在正则表达式中无法完成,而要具体化:读取某种非常特殊格式的XML并对其进行修改,但是如果不遵守约定并发送不符合此规范中规定的规则的有效XML,则会执行任意的奇怪操作并损坏XML。
也许你想要选项2,但你必须更新问题,并准确列出你的想法。选项2是一个非常糟糕的主意- XML强烈建议,好吧,'有效的XML格式是好的',它将结束混淆一些人,如果你的应用程序接受XML,但实际上,只有非常特定格式的XML。
请注意,粘贴的XML无效;<GATE SUITE>部分是错误的,不管是什么代码生成了这个XML,都是错误的,可能是因为您在那里犯了同样的错误(只需要使用基本的文本处理代码,如.substring、字符串连接和正则表达式,就可以生成XML。使用实际的XML构建器,这种情况永远不会发生)。与其将错误层层叠加,回到产生这个损坏的XML的错误代码,并在那里修复它。
如果您必须修复这个特定的东西,您唯一真实的的选择是扫描<Addr1></Addr1>,并使用.substring等命令将您的修改仅应用于其中的东西-假定XML是无效的,您不能将其解析为XML(解析器会正确地向您抛出一个异常),这样,至少你已经把可能导致问题的修改减少到了一个更小的部分。这是最后的手段,需要大量的注解来解释你的修改。We“我们正在解决一个现有的大问题,而且这段代码很可能很快就会被破坏。

相关问题