org.xml.sax.SAXParseException:对实体“T”的引用必须以’;’结尾 分隔符

我试图解析一个XML文件,其中包含一些特殊字符,如“&”使用DOM解析器。 我得到saxparseexception“对实体的引用必须以分隔符结束”。 有没有办法克服这个exception,因为我无法修改XML文件来删除特殊字符,因为它来自不同的应用程序。 请建议一种解析此XML文件以获取根元素的方法?

提前致谢

这是我正在解析的XML部分

EDTA/THAM WASH

jhc ^ 72. METER SOLVENT: Meter 21 LITERS of RO WATER through the add line into FT-250. Start agitator.

RO WATER <ZLl LITERS

• NOTE: The following is a tool control operation. The area within 10 feet of any open vessel or container is under tool control.

-af . 73. CHARGE SOLIDS: Remove any unnecessary items from the tool controlled area. Indicate the numbers of each item that will remain in the tool controlled area during the operation in the IN box of the Tool Control Log.

^___y_ a. To minimize the potential for cross contamination, confirm that no other solids are being charged or packaged in adjacent equipment.

kk k WARNING: Wear protective gloves, air jacket and use local exhaust when handling TROMETHAMINE USP (189400) (THAM) (Kl--Irritant!). The THAM may be dusty.

-<&^b . Charge 2.1 KG of TROMETHAMINE USP (189400) (THAM) into FT-250 through the top.

TROMETHAMINE USP (189400) (THAM)

Scale ID: / / 7S

LotNo.: qy/o^yo^

Gross: ^ . S

Tare: 10 ,1

Net: J^l

Total: JL'J

&T
Checked by

正如其他人所说,你的XML肯定是无效的。 但是,如果您无法更改生成应用程序并且可以添加清理步骤,那么以下内容应该清理XML:

 String clean = xml.replaceAll( "&([^;]+(?!(?:\\w|;)))", "&$1" ); 

正则表达式正在寻找任何forms错误的实体引用并转义&符号。

具体来说, (?!(?:\\w|;))是一个负向前瞻,使得该匹配停止在任何不是单词字符(az,0-9)而不是分号的任何内容上。 所以整个正则表达式都抓住了所有的东西,而不是一个; 直到第一个非单词,非分号字符。

它将除&符号之外的所有内容放在第一个捕获组中,以便可以在替换字符串中引用它。 这是1美元。

请注意,这不会修复看起来有效但不是有效的引用。 例如,如果你有&T; 除非XML实际定义了实体,否则会完全抛出不同类型的错误。

我不确定我理解这个问题。 据我所知,除非你在CDATA里面,否则裸体&角色没有关闭; 无效。

如果您的XML文件不是这样,那么它就是无效的,您需要找到另一种解析方法,或者在SAX获取它之前修复它。

如果我在这里误解了一些东西,你应该发布实际XML的样本,这样我们就可以进一步了解。

更新:

看起来像:

 Figure ActualText="&T " 

是令人讨厌的线。 这部分是否属于CDATA ? 如果没有,这不是有效的XML,你不应该期望SAX能够处理它。

你需要:

  • 更改创建它的应用程序; 要么
  • 在它被SAX(如果你不能改变那个应用程序)加载到类似“ Figure ActualText="&T " ”之类的东西之前修复它; 要么
  • 找到一个非SAX方法进行解析。

有些人可能熟悉错误“对实体XX的引用必须以’;’结尾 分隔符“在向XML模板添加或更改任何代码时。 当我尝试更改或添加一些代码到我的博客博客模板(XML)时,我甚至会得到错误。

当我们向XML模板添加任何第三方横幅或小部件时,通常会出现这种错误。 我们可以通过对我们添加的代码进行轻微更改来轻松纠正错误!

 Just replace “&” with “&” in your HTML/Javascript code! 

 Original Code:    Altered Code:    

作为解决方法,您可以:

  1. 将所有出现的&替换为& 在原始输入;
  2. 解析它;
  3. 在处理结果的代码中,处理现在获得转义字符的情况(例如<而不是< )。

根据您正在使用的解析器,您还可以尝试找到负责解析和转义& -strings的类,并查看是否可以扩展它/提供您自己的解析器。 (我所说的非常模糊,但细节取决于您使用的工具。)

您的输入是无效的XML。 具体而言,除非属于格式正确的字符实体引用,否则不能在属性值中包含“&”字符。

AFAIK,你有两个选择:

  • 自己编写一个“不完全是XML”的解析器。 我非常怀疑你会找到一个现有的。 任何自尊的XML解析器都会拒绝无效的输入。
  • 修复创建此(所谓的)XML的任何内容,以便它不会将随机“&”字符放在不允许的位置。 真的很简单。 在构建XML时,使用’&amp;’替换不属于字符引用的’&’字符。

基于PSpeed的上述答案,以下替换所有正则表达式和替换文本将替换所有未转义的&符号的未转义的&符号。

 String clean = xml.replaceAll( ("(&(?!amp;))", "&") ); 

该模式是一个负向前瞻,以匹配任何尚未转义的&符号,替换字符串只是一个转义符号。 通过使用静态编译的Pattern,可以进一步优化性能。

 private final static Pattern unescapedAmpersands = Pattern.compile("(&(?!amp;))"); ... Matcher m = unescapedAmpersands.matcher(xml); String xmlWithAmpersandsEscaped = m.replaceAll("&"); 

只需将您的&替换为& 它会起作用。