Java StAX - 解析时出错 - 非法字符实体:扩展字符代码 0x19
Java StAX - error when parsing - Illegal character entity: expansion character code 0x19
我是 reading/parsing 一个 XML 文件 javax.xml.stream.XMLStreamReader
。
该文件包含如下所示的XML条数据。
<Row>
<AccountName value="Paving 101" />
<AccountNumber value="20205" />
<AccountId value="15012" />
<TimePeriod value="2019-08-20" />
<CampaignName value="CMP Paving 101" />
<CampaignId value="34283" />
<AdGroupName value="residential paving" />
<AdGroupId value="1001035" />
<AdId value="790008" />
<AdType value="Expanded text ad" />
<DestinationUrl value="" />
<BidMatchType value="Broad" />
<Impressions value="1" />
<Clicks value="1" />
<Ctr value="100.00%" />
<AverageCpc value="1.05" />
<Spend value="1.05" />
<AveragePosition value="2.00" />
<SearchQuery value="concretedrivewayrepairmethods" />
</Row>
不幸的是,我遇到了这个错误,我不确定如何解决它。
Error in downloadXML:
com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x19
at [row,col {unknown-source}]: [674,40]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2448)
at com.ctc.wstx.sr.StreamScanner.validateChar(StreamScanner.java:2395)
at com.ctc.wstx.sr.StreamScanner.resolveSimpleEntity(StreamScanner.java:1218)
at com.ctc.wstx.sr.BasicStreamReader.parseAttrValue(BasicStreamReader.java:1929)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:3063)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2961)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2837)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
这个字符似乎有问题 
。
当然,我可以首先将文件简单地作为文本文件读取,并替换这个坏字符,然后才用 XMLStreamReader
解析它但是:
1) 这种方法对我来说真的很笨拙;
2) 代码比较复杂,做起来会有点困难,
所以我不确定我是否只想为这个角色改变它。
为什么 XMLStreamReader 无法处理这个字符?
是XML无效还是解析器有bug没处理好?
字符&
、<
和>
(以及属性中的"
或'
)在XML中无效.
它们使用 XML 个实体进行转义,在这种情况下,您需要 &
用于 &
。
您的 XML 对于每个正确的库都是无效的; (您需要的可能是此 XML 内容的制作人)
**编辑* 来自 https://www.w3.org/TR/xml/#NT-Char
实体引用的允许范围:
Reference ::= EntityRef | CharRef
EntityRef ::= '&' Name ';'
CharRef ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
我是 reading/parsing 一个 XML 文件 javax.xml.stream.XMLStreamReader
。
该文件包含如下所示的XML条数据。
<Row>
<AccountName value="Paving 101" />
<AccountNumber value="20205" />
<AccountId value="15012" />
<TimePeriod value="2019-08-20" />
<CampaignName value="CMP Paving 101" />
<CampaignId value="34283" />
<AdGroupName value="residential paving" />
<AdGroupId value="1001035" />
<AdId value="790008" />
<AdType value="Expanded text ad" />
<DestinationUrl value="" />
<BidMatchType value="Broad" />
<Impressions value="1" />
<Clicks value="1" />
<Ctr value="100.00%" />
<AverageCpc value="1.05" />
<Spend value="1.05" />
<AveragePosition value="2.00" />
<SearchQuery value="concretedrivewayrepairmethods" />
</Row>
不幸的是,我遇到了这个错误,我不确定如何解决它。
Error in downloadXML:
com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x19
at [row,col {unknown-source}]: [674,40]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2448)
at com.ctc.wstx.sr.StreamScanner.validateChar(StreamScanner.java:2395)
at com.ctc.wstx.sr.StreamScanner.resolveSimpleEntity(StreamScanner.java:1218)
at com.ctc.wstx.sr.BasicStreamReader.parseAttrValue(BasicStreamReader.java:1929)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:3063)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2961)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2837)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
这个字符似乎有问题 
。
当然,我可以首先将文件简单地作为文本文件读取,并替换这个坏字符,然后才用 XMLStreamReader
解析它但是:
1) 这种方法对我来说真的很笨拙;
2) 代码比较复杂,做起来会有点困难,
所以我不确定我是否只想为这个角色改变它。
为什么 XMLStreamReader 无法处理这个字符?
是XML无效还是解析器有bug没处理好?
字符&
、<
和>
(以及属性中的"
或'
)在XML中无效.
它们使用 XML 个实体进行转义,在这种情况下,您需要 &
用于 &
。
您的 XML 对于每个正确的库都是无效的; (您需要的可能是此 XML 内容的制作人)
**编辑* 来自 https://www.w3.org/TR/xml/#NT-Char
实体引用的允许范围:
Reference ::= EntityRef | CharRef
EntityRef ::= '&' Name ';'
CharRef ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */