Java XML Unmarshalling在使用JAXB的“与”()上失败&

ej83mcc0  于 2023-03-28  发布在  Java
关注(0)|答案(4)|浏览(139)

我有下面的XML:

<?xml version="1.0" encoding="UTF-8"?>
<details>
  ...
  <address1>Test&amp;Address</address1>
  ...
</details>

当我尝试使用JAXB解封它时,它抛出以下异常:

Caused by: org.xml.sax.SAXParseException: The reference to entity "Address" must end with the ';' delimiter.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:194)

但是当我将XML中的&amp;更改为&apos;时,它可以工作。看起来问题只与&amp;有关,我不明白为什么。
要取消编组的代码为:

JAXBContext context = JAXBContext.newInstance("some.package.name", this.getClass().getClassLoader());
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = unmarshaller.unmarshal(new StringReader(xml));

有人有什么见解吗?
编辑:我尝试了下面@abhin4v建议的解决方案(即在&amp;后面加一个空格),但似乎不太管用。

Caused by: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:194)
wpx232ag

wpx232ag1#

我也遇到过这种情况。第一遍我只是简单地将&amp替换为一个令牌字符串(AMPERSAND_TOKEN),通过JAXB发送它,然后重新替换与号。不理想,但这是一个快速修复。
第二遍我做了很多重要的修改,所以我不确定到底是什么解决了这个问题,我怀疑提供JAXB访问html dtd会让它更好,但这只是一个猜测,可能是我的项目特有的。
高温加热

puruo6ea

puruo6ea2#

Xerces将&amp;转换为&,然后尝试解析&Address,但失败了,因为它没有以;结束。在&Address之间放置一个空格,它应该可以工作。放置空格将不起作用,因为Xerces现在将尝试解析&并抛出OP中给出的第二个错误。您可以将测试 Package 在CDATA节中,Xerces将不会尝试解析实体。

xtupzzrd

xtupzzrd3#

原来这个问题是因为我使用的框架(Mentawai framework)。上述XML来自HTTP请求的POST主体。
显然,框架转换了XML主体中的字符实体,因此,&amp;变成了&,并且解组器无法解组XML。

4bbkushb

4bbkushb4#

我发现添加**amp;**将修复解组错误。您希望它看起来像这样:

<address1>Test&amp;amp;Address</address1>

我认为这是在告诉解组器,应该将与号读取为数据值(在本例中为文本),而不是实体标识符。

相关问题