2017-08-24 60 views
0

我使用woodstox來解析一些svg文件。這隻適用於我在線的情況。離線它似乎不會使用woodstox,但會回落到默認分析器。在這種情況下,它會變慢(5分鐘vs 15秒)。對於目前的SVG,它也會引發異常。woodstox無法離線工作

我做錯了什麼?爲什麼woodstox不會離線使用?

使用Maven的依賴性:

<dependency> 
    <groupId>com.fasterxml.woodstox</groupId> 
    <artifactId>woodstox-core</artifactId> 
    <version>5.0.3</version> 
</dependency> 

代碼解析:

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
XMLEventReader reader = inputFactory.createXMLEventReader(new FileInputStream(svgFile)); 
while(reader.hasNext()) { 
    XMLEvent event = reader.nextEvent(); 
... 
} 

這是reader.nextEvent()拋出的異常:

com.ctc.wstx.exc.WstxIOException: www.w3.org 
at com.ctc.wstx.sr.StreamScanner.throwFromIOE(StreamScanner.java:705) 
at com.ctc.wstx.sr.ValidatingStreamReader.findDtdExtSubset(ValidatingStreamReader.java:466) 
at com.ctc.wstx.sr.ValidatingStreamReader.finishDTD(ValidatingStreamReader.java:326) 
at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3836) 
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2168) 
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1181) 
at org.codehaus.stax2.ri.Stax2EventReaderImpl.nextEvent(Stax2EventReaderImpl.java:255) 

這是我SVGs之一。它是否畸形?

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" 
height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve"> 
    <g id="Ebene_1"> 
    <path fill="currentColor" d="M38.338,9.412H12.592v47.438h38.521V22.296L38.338,9.412z M46.728,51.866H17.191V14.129h14.771v12.577 
    h14.766V51.866z"/> 
    </g> 
</svg> 
+2

也許分析器試圖下載dtd? –

回答

2

解析器只是試圖加載使用DOCTYPE聲明中指定的URL DTD子集: 「http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd」。這是xml規範規定它必須做的事情(或者使用某種機制通過公共標識獲取副本)。 無論是否啓用DTD驗證,都必須進行此操作:DTD子集也可能包含ENTITY聲明,如果沒有讀取它,則無法知道是否如此。

但是:如果沒有實體和你不想DTD驗證,你可以簡單地禁用DTD與完全處理:

inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); 

這將阻止閱讀。您還將快速瞭解是否有任何實體丟失。 :)

+0

禁用DTD解決了我的問題。 我真的不知道在這種情況下實體是什麼。我想我沒有使用任何。 (否則我會知道?)。 – BluE

+0

@BluE實體有多種風格:更常見的是以&符號('&')開頭並且有名字的實體。有5個預定義的(amp,apos,quot,lt,gt),這些都很好,但是如果你需要聲明任何其他的,它們將會在DTD中。我認爲你不會以有問題的方式使用實體。 – StaxMan