[英]Validate and parse xml using woodstox with local dtd
我已經看到了多個問題,這些問題與使用woodstox和JAXB解析xml以使用XMLStreamReader
解組並針對模式進行驗證有關。盡管它們沒有幫助。 我需要的是使用本地DTD驗證傳入的xml,並將整個內容解析為一個對象表示形式。 傳入的xml可以具有包含DTD的DOCTYPE。 需要跳過這一步,而需要使用本地DTD。 實施應該很快。 預期<1ms進行驗證和解析。 我可以在5毫秒內使用以下方法單獨解析。 合並驗證不適用於設置架構(注釋的代碼行)
xmlif = XMLInputFactory2.newInstance();
xmlif.setProperty(XMLInputFactory2.SUPPORT_DTD, false);
JAXBContext ucontext;
ucontext = JAXBContext.newInstance(XMLOuterElementClass.class);
unmarshaller = ucontext.createUnmarshaller();
/*SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI);
Schema schema = sf.newSchema(new File("c:/resources/schma.dtd"));
unmarshaller.setSchema(schema);*/
XMLStreamReader xsr = xmlif
.createXMLStreamReader(new StringReader(xml));
//xsr = new StreamReaderDelegate(xsr);
long start = System.currentTimeMillis();
try {
while (xsr.hasNext()) {
if (xsr.isStartElement()
&& xsr.getLocalName() == "XMLOuterElementClass") {
break;
}
xsr.next();
}
JAXBElement<XMLOuterElementClass> jb = unmarshaller.unmarshal(xsr,
XMLOuterElementClass.class);
System.out.println("Total time taken in ms :" + (end - start));
} finally {
xsr.close();
}
有多種方法可以做到這一點。 獲得更深入答案的最佳方法是在Woodstox用戶列表中詢問此問題(請參閱http://xircles.codehaus.org/projects/woodstox/lists )。
但是需要注意的一件事是,JAXB對Stax2一無所知(Woodstox / Aalto對基本Stax的擴展),因此您需要通過Stax2 API而不是JAXB來訪問它。 因此,要啟用“外部”驗證,您需要調用:
xmlStreamReader2.validateAgainst(schemaFromDTD);
並且您可以在構造流閱讀器之后立即執行此操作(需要轉換為XMLStreamReader2
,或至少轉換為Validatable
)。 請注意,您可以在讀取或寫入時進行驗證,兩者的工作方式相似(在后一種情況下,您可以通過XMLStreamWriter
啟用它)。
另一種可能性是定義XMLResolver
屬性(請參見XMLInputFactory.RESOLVER
)。 嘗試讀取外部dtd時,即DOCTYPE包含對外部文件的引用時,將調用它。 然后,自定義XMLResolver
可以重定向此讀取以使用其他一些源。
請注意,第一種方法(您開始使用的方法)可能會更有效,因為它只需要讀取和解析一次Schema(假定您一次讀取並隨后重用)即可。 驗證本身應該很快,並且如果解析花費4毫秒,則花費的時間不應超過1毫秒; 尤其是如果您在4毫秒內包含JAXB處理(技術上是數據綁定,在較低級別的解析之上)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.