Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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 org.xml.sax.SAXParseException:对实体的引用;";必须以';结尾';分隔符_Java_Xml - Fatal编程技术网

Java org.xml.sax.SAXParseException:对实体的引用;";必须以';结尾';分隔符

Java org.xml.sax.SAXParseException:对实体的引用;";必须以';结尾';分隔符,java,xml,Java,Xml,我试图使用DOM解析器解析一个XML文件,其中包含一些特殊字符,如“&”。我得到了saxparse异常“对实体的引用必须以分隔符结尾”。有没有办法克服这个异常,因为我无法修改XML文件来删除特殊字符,因为它来自不同的应用程序。请建议一种解析此XML文件以获取根元素的方法 提前谢谢 这是我正在解析的XML部分 <P>EDTA/THAM WASH </P> <P>jhc ^ 72. METER SOLVENT: Meter 21 LITERS of R. O.

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

提前谢谢

这是我正在解析的XML部分

<P>EDTA/THAM WASH 
</P>

<P>jhc ^ 72. METER SOLVENT: Meter 21 LITERS of R. O. WATER through the add line into 
FT-250. Start agitator. 
</P>

<P>R. O. WATER &lt;ZLl LITERS </P>

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

<P>-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. </P>

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

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

<P>-&lt;&amp;^b .   Charge 2.1 KG of TROMETHAMINE USP (189400) (THAM) into FT-250 through the top. </P>

<P>TROMETHAMINE USP (189400) (THAM) </P>

<P>Scale ID:     / / 7S </P>

<P>LotNo.:   qy/o^yo^ </P>

<P>Gross:    ^ . S </P>

<P>Tare: 10 ,1 </P>

<P>Net:     J^l </P>

<P>Total:   JL'J </P>

<P><Figure ActualText="&T ">

<ImageData src="images/17PT 07009K_img_1.jpg"/>
&amp;T </Figure>
Checked by </P>
EDTA/THAM清洗剂

jhc^72。计量溶剂:计量21升R.O.水,通过添加管线进入 FT-250。启动搅拌器。

R.O.水ZLl升

•注:以下是刀具控制操作。任何开放容器或容器10英尺范围内的区域受工具控制

-自动对焦。73装填固体:从刀具控制区域移除任何不必要的项目。在刀具控制日志的输入框中指示操作期间刀具控制区域中保留的每个项目的编号

是的。为尽量减少交叉污染的可能性,确认相邻设备中没有其他固体被装填或包装

kk警告:在处理氨丁三胺USP(189400)(THAM)(k-l-刺激物!)时,请戴上防护手套、穿上空气夹克并使用局部排气。泰姆河可能布满灰尘

-&^B通过顶部向FT-250中加入2.1 KG的氨丁三醇USP(189400)(THAM)

氨丁三醇美国药典(189400)(THAM)

刻度ID://7S

LotNo.:qy/o^yo^

毛额:^。S

皮重:10,1

净值:J^l

总计:JL'J

&;T 检查人


我不确定我是否理解这个问题。据我所知,除非你在一个
CDATA
中,否则就没有结尾的
&
字符无效

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

如果我在这里误解了什么,您可能应该发布一个实际XML的示例,这样我们可以进一步提高效率

更新:

它看起来像:

Figure ActualText="&T "
这是一条令人不快的路线。此部分是否在CDATA中?否则,这是无效的XML,您不应该期望SAX能够处理它

您需要:

  • 更改创建它的应用程序;或
  • 在SAX将其加载到类似“
    Figure-ActualText=“&;”之类的内容之前(如果您无法更改该应用程序),请将其修复;T“
    ”;或
  • 查找用于解析的非SAX方法

作为一种解决方法,您可以:

  • 将所有出现的
    替换为
    &
    
  • 解析它
  • 在处理结果的代码中,处理现在获得转义字符的情况(例如,
    而不是
    您的输入是无效的XML。具体来说,属性值中不能有“&”字符,除非它是格式良好的字符实体引用的一部分

    好吧,你有两个选择:

    • 自己编写一个“不完全是XML”解析器。我严重怀疑您是否能找到一个现有的解析器。任何自尊的XML解析器都会拒绝无效的输入
    • 修复创建此(所谓)XML的任何内容,使其不会在不允许的位置放置随机的“&”字符。这实际上非常简单。在构建XML时,将尚未作为字符引用一部分的“&”字符替换为“&;”

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

    String clean = xml.replaceAll( "&([^;]+(?!(?:\\w|;)))", "&amp;$1" );
    
    正则表达式所做的是查找任何格式错误的实体引用并逃逸符号

    具体来说,
    (?!(?:\\w |))
    是一种消极的前瞻,它使匹配停止在任何不是单词字符(a-z,0-9)和分号的地方。因此,整个正则表达式将获取从&that not a;;到第一个非单词、非分号字符的所有内容

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


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

    有些人可能熟悉错误“对实体XX的引用必须以“;”分隔符结尾”在向XML模板中添加或更改任何代码时。即使我有时在尝试更改或向我的博客模板(XML)中添加一些代码时也会出现这种错误

    大多数此类错误都是在我们向XML模板添加任何第三方横幅或小部件时发生的。我们可以通过稍微修改添加的代码来轻松纠正该错误

    Just replace “&” with “&amp;” in your HTML/Javascript code!
    
    范例

    Original Code:
    <!– Begin Code –>
    <script src="http://XXXXXX.com/XXX.php?sid=XXX&br=XXX&dk=XXXXXXXXXXXX" type="text/javascript"/>
    <!– End Code –>
    
    Altered Code:
    
    <!– Begin Code –>
    <script src="http://XXXXXX.com/XXX.php?sid=XXX&amp;br=XXX&amp;dk=XXXXXXXXXXXX" type="text/javascript"/>
    <!– End Code –>
    
    原始代码:
    更改代码:
    
    基于PSpeed的上述答案,以下replaceAll正则表达式和替换文本将用转义的符号替换所有未转义的符号

    String clean = xml.replaceAll( ("(&(?!amp;))", "&amp;") );
    
    该模式是一个负前瞻,用于匹配任何尚未转义的符号,而替换字符串只是一个转义的符号。通过使用静态编译模式,可以进一步优化该模式的性能

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

    只需将您的
    &
    替换为
    &;
    ,它就会工作。

    如果您在发布之前使用下面的命令,它就会工作

    请在下面的命令中输入您的xml文件名

    sed -i "s/&/;/g" *.xml
    

    作为@PSpeed答案的补充,这里有一个完整的解决方案(SAX解析器):

    说明:

    • 将Blob转换为InputStream
    • 清理Blo
          try {
      
              InputStream xmlStreamToParse = blob.getBinaryStream();
      
              // Clean
              BufferedReader br = new BufferedReader(new InputStreamReader(xmlStreamToParse));
      
              StringBuilder sb = new StringBuilder();
      
              String line;
              while ((line = br.readLine()) != null) {
                  sb.append(line.replaceAll("&([^;]+(?!(?:\\w|;)))", "&amp;$1")); // or whatever you want to clean
              }
      
              InputStream stream = org.apache.commons.io.IOUtils.toInputStream(sb.toString(), "UTF-8");
      
              // Parsing
              SAXParserFactory saxFactory = SAXParserFactory.newInstance();
              saxFactory.setNamespaceAware(true);
              SAXParser theParser = saxFactory.newSAXParser();
              XMLReader xmlReader = theParser.getXMLReader();
              LicenceXMLHandler licence = new LicenceXMLHandler();
              xmlReader.setContentHandler(licence);
              xmlReader.parse(new InputSource(stream));
      
          } catch (SQLException | SAXException | IOException | ParserConfigurationException e) {
              log.error("Error: " + e);
          }