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

标签 java xml regex

我遇到了与这些主题中描述的问题类似的问题 1) Replace >, <, & chars that appear inside XML nodes 2) 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/

相关文章:

java 多维数组列表

java - 两个类都有main方法,哪个会先执行?

xml - 正确使用 XML

xml - XSLT 1.0 - 分组 xml 元素

javascript 替换为具有特定 id 的正则表达式 img 标记,但其他属性可以是任何内容

java - Map Java的递归迭代

java.lang.ClassCastException : android. widget.LinearLayout 无法转换为 android.support.v7.widget.Toolbar

java - XML 架构 : Setting fixed value for an attribute defined in a base-type

javascript - 正则表达式中的多个条件 - 如何用破折号替换冒号和空格

javascript - 手机号码字段也接受无效号码