簡體   English   中英

使用Woodstox和本地dtd驗證並解析xml

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM