Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换>&书信电报;,及;出现在XML节点内的字符_Java_Xml_Regex - Fatal编程技术网

Java 替换>&书信电报;,及;出现在XML节点内的字符

Java 替换>&书信电报;,及;出现在XML节点内的字符,java,xml,regex,Java,Xml,Regex,我有一个类似于这些主题中描述的问题 1) 替换>,我强烈建议您不要使用正则表达式来解析XML,在这种情况下,您根本不应该使用正则表达式 您需要的是一个好的XML解析器/拖缆框架,例如or(由于文件的大小,我选择后者) 你基本上会把你读到的每一个流媒体事件推给一个作者 在使用读卡器实例解析文件时,一旦识别出字符事件,就不用直接编写它,而是将每个符号替换为其实体,并编写替换的字符串,而不是原始符号 注意:这是一个官方的StaX教程,让您开始学习。是JEE5参考页,其中包含其他信息 为什么要这样做而不

我有一个类似于这些主题中描述的问题
1) 替换>,我强烈建议您不要使用正则表达式来解析XML,在这种情况下,您根本不应该使用正则表达式

您需要的是一个好的XML解析器/拖缆框架,例如or(由于文件的大小,我选择后者)

你基本上会把你读到的每一个流媒体事件推给一个作者

在使用读卡器实例解析文件时,一旦识别出
字符
事件,就不用直接编写它,而是将每个符号替换为其实体,并编写替换的
字符串
,而不是原始符号

注意:这是一个官方的StaX教程,让您开始学习。是JEE5参考页,其中包含其他信息

为什么要这样做而不是应用
模式
并使用
缓冲读取器
解析整个文件?

  • 因为性能会很糟糕(针对5MB文件的每一行重新匹配
    模式
  • 因为您的
    模式必须非常复杂(因此,不可读,而且性能很差)
更多关于正则表达式XML解析与正确XML解析的文档

编辑

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

如果你已经用尽了所有其他的选择,你想闭上你的鼻子,使用一个
BufferedReader
,然后做这样的事情(需要大量的精雕细琢-不要照字面理解):

String killMe=“blah<>&”;
//这里唯一有价值的信息:检查节点中的字符
//跨越多条线-同样,需要大量的工作

Pattern请=Pattern.compile(“>(.+)这是一个困难的问题,因为据我所知,XML内容中有像><这样的标记,这是无效的XML。我最好的建议是找到一个好的XML解析器,希望它能处理您的问题。

您想用<?为什么?>替换,而且您的前后语句是相同的。有什么特别的建议吗为什么不使用CDATA块?顺便说一句,我不会使用正则表达式来解决这个问题。@Philip:就我对这个问题的解释而言,OP实际上想用另一种方法来解决这个问题(即,使语法无效的XML在语法上有效)。至少在标题、链接和代码示例中提到了这一点。您的解释建议您根据对2的响应转到
,我不确定这是否可行:
某个
另一个
将转换为
某个东西br/另一个
,即使您考虑嵌套。我认为您应该修复任何问题生成此代码。(谢谢@BalusC)XML不是常规语言。它意味着:请不要尝试将其输入正则表达式。您只会得到痛苦。
<tag><anothertag>& < > </anothertag></tag> (before)
<tag><anothertag>&amp; &lt; &gt; </anothertag></tag> (after).
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;