2

woodstox と JAXB を使用して xml を解析し、を使用して非整列化し、スキーマXMLStreamReaderに対して検証することに関連する複数の質問を見てきました。私が必要としているのは、着信 xml をローカル DTD で検証し、コンテンツ全体をオブジェクト表現に解析することです。着信 xml には、DTD を含む DOCTYPE を含めることができます。これはスキップする必要があり、代わりにローカル DTD を使用する必要があります。実装は非常に迅速に行う必要があります。検証と解析の実行に 1 ミリ秒未満が予想されます。以下を使用して、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();
        }
4

1 に答える 1

3

それには複数の方法があります。より詳細な回答を得る最善の方法は、Woodstox ユーザー リスト ( http://xircles.codehaus.org/projects/woodstox/listsを参照) で質問することです。

ただし、JAXB は Stax2 (基本的な Stax に対する Woodstox/Aalto 拡張機能) について何も知らないため、JAXB ではなく Stax2 API を介してアクセスする必要があることに注意してください。したがって、「外部」検証を有効にするには、次を呼び出す必要があります。

xmlStreamReader2.validateAgainst(schemaFromDTD);

ストリームリーダーを構築した直後にこれを行うことができます(XMLStreamReader2、または少なくとも にキャストする必要がありますValidatable)。読み取りまたは書き込み時に検証できることに注意してください。どちらも同様に機能します (後者の場合は、 で有効にしますXMLStreamWriter)。

もう 1 つの可能性は、XMLResolverプロパティを定義することです (「参考文献」を参照XMLInputFactory.RESOLVER)。外部 dtd を読み取ろうとするとき、つまり DOCTYPE に外部ファイルへの参照が含まれているときに呼び出されます。カスタムXMLResolverは、この読み取りをリダイレクトして、他のソースを使用できます。

最初のアプローチ (最初に使用したもの) は、一度読み取って後で再利用すると仮定すると、スキーマを一度読み取って解析するだけでよいため、より効率的である可能性が高いことに注意してください。検証自体は高速である必要があり、解析に 4 ミリ秒かかる場合でも、1 ミリ秒以上かかることはありません。特に、JAXB 処理を 4 ミリ秒で含める場合 (これは技術的にはデータバインディングであり、下位レベルの解析より上です)。

于 2013-08-21T17:02:02.117 に答える