gpt4 book ai didi

java - 替换 XML 节点内出现的 >、< 和 & 字符

转载 作者:行者123 更新时间:2023-12-02 06:41:24 24 4
gpt4 key购买 nike

我遇到了与这些主题中描述的问题类似的问题1) Replace >, <, & chars that appear inside XML nodes2) Regular expression to match ">", "<", "&" chars that appear inside XML nodes

我正在寻找一个在 Java 中工作的解决方案。实际上,我有一个巨大的 XML 文件(~5 MB),我想用它们各自的实体(转义字符)替换特殊字符,而不更改 XML 标记。一个典型的例子应该是:

<tag><anothertag>& < > </anothertag></tag> (before)
<tag><anothertag>&amp; &lt; &gt; </anothertag></tag> (after).

提前致谢

最佳答案

我强烈建议您不要使用正则表达式来解析 XML,在这种情况下,您根本不应该使用正则表达式。

你需要的是一个好的XML解析器/流框架,比如SAXStaX (由于文件的大小,我会选择后者)。

您基本上会将您读到的每个流媒体事件推送给作家。

一旦您在使用阅读器实例解析文件时识别出 characters 事件,您无需直接写入它,而是将每个符号替换为其实体,然后写入替换的 String 而不是原来的。

注:here是帮助您入门的官方 StaX 教程。 Here是 JEE5 引用页,其中包含附加信息。

为什么这样做而不是应用 Pattern 并使用 BufferedReader 解析整个文件?

  • 因为性能会很糟糕(为 5MB 文件的每一行重新匹配 Pattern)
  • 因为您的模式必须非常复杂(因此不可读,而且性能也很差)

有关正则表达式 XML 解析 VS 正确 XML 解析的更多 SO 文档 here

编辑

我还没有考虑过一个巨大的、完全畸形的 XML 文件的情况。在这种情况下,流式传输框架可能无法使用,因为流式传输的文件首先不是有效的 XML。

如果您已经用尽了所有其他选择,您想捏紧 Nose ,使用 BufferedReader,并执行类似的操作(需要大量详细阐述 - don不要从字面上理解):

String killMe = "<element>blah < > &</element>";
// only valuable piece of info here: checks for characters within a node
// across multiple lines - again, needs a lot of work
Pattern please = Pattern.compile(">(.+)</", Pattern.MULTILINE);
Matcher iWantToDie = please.matcher(killMe);
while (iWantToDie.find()) {
System.out.println("Uugh: " + iWantToDie.group(1));
System.out.println("LT: " + iWantToDie.group(1).replace("<", "&lt;"));
System.out.println("GT: " + iWantToDie.group(1).replace(">", "&gt;"));
System.out.println("AND: " + iWantToDie.group(1).replace("&", "&amp;"));
}

输出:

Uugh: blah < > &
LT: blah &lt; > &
GT: blah < &gt; &
AND: blah < > &lt;

关于java - 替换 XML 节点内出现的 >、< 和 & 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19103620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com