Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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_Utf 8_Replace - Fatal编程技术网

如何在Java中高效地替换XML文档中的字符?

如何在Java中高效地替换XML文档中的字符?,java,xml,utf-8,replace,Java,Xml,Utf 8,Replace,我正在寻找一种简洁高效的方法来替换XML文档中的字符。有一个为近12000个UTF-8字符定义的替换表,其中大多数字符将替换为单个字符,但有些字符必须替换为两个甚至三个字符(例如,希腊语θ应变为TH)。这些文档可能很大(100MB+)。如何在Java中实现它?我提出了使用XSLT的想法,但我不太确定这是否是最好的选择。看看SAX,它允许您在XML文档的每个部分经过时查看它们。然后可以对文本节点执行操作,并执行所需的操作 XSLT的问题是,大多数实现都需要在内存中保存整个输入树,通常是磁盘大小的1

我正在寻找一种简洁高效的方法来替换XML文档中的字符。有一个为近12000个UTF-8字符定义的替换表,其中大多数字符将替换为单个字符,但有些字符必须替换为两个甚至三个字符(例如,希腊语θ应变为TH)。这些文档可能很大(100MB+)。如何在Java中实现它?我提出了使用XSLT的想法,但我不太确定这是否是最好的选择。

看看SAX,它允许您在XML文档的每个部分经过时查看它们。然后可以对文本节点执行操作,并执行所需的操作


XSLT的问题是,大多数实现都需要在内存中保存整个输入树,通常是磁盘大小的10倍。我只知道Saxon XSLT transformer的商业版,它可以执行流式XSLT(但这非常适合您的需要)

根据我的经验,String.replace(..)非常慢。我曾经使用该API解析100MB KML文件,但性能很差。然后,我使用Pattern.compile(..)预编译了正则表达式,这大大加快了运算速度。

很好。由于不需要将其视为XML,我完全忘记了考虑它的Java部分的最佳解决方案。定义了一个包含12000个替换项的大型映射表。这就是为什么我考虑将映射加载到HashMap,然后根据该映射检查XML标记文本内容的每个字符。那又如何呢?是的,我认为您需要该映射表,无论它是在映射中,还是存储在数据库中,并且让Hibernate为您处理缓存。也许,您可以使用一个预编译正则表达式来扫描整个XML,首先查找非字母数字字符,然后针对这些字符中的每一个,对照映射检查是否存在这样的字符,如果存在,则创建另一个预编译正则表达式来执行特定的字符替换。也许,这不是最好的解决方案,但我只是在这里抛出一些想法。为了给我的上述策略添加更多内容,关键是如果不需要的话,不要循环使用整个12K键。谢谢limc。这就是我们决定要做的。我们将使用regexp检查文本值是否有任何非标准字符,然后使用映射(在内存中)执行替换。一个好方法是创建一个16位查找表,并使用字符值执行查找和替换。这就是XML解析器检查字符的方法validity@vtd-xml作者:你是说它只适用于Unicode 3.0?对于包含65535以上代码点的UTF-8编码XML文件,这将如何工作?这一点很好。根据这个问题,它似乎不会超过16位,因为帖子说这些字符“被两个甚至三个字符替换”@vtd xml作者:呃:)我实际上是在问关于您提到的xml解析器检查字符有效性的问题:它们不支持Unicode 3.1+还是除了查找表之外还使用了其他一些技巧(这是我非常喜欢的想法)?我的意思是,解析UTF-8文件的XML解析器应该接受Unicode 3.1和更新的代码点,对吗?!(我被您提到的16位查找表弄糊涂了:)简单的回答是xml解析器会检查16位以上字符的有效性,这部分是通过使用简单的比较来完成的