首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用本地dtd使用woodstox验证和解析xml

用本地dtd使用woodstox验证和解析xml
EN

Stack Overflow用户
提问于 2013-08-21 09:21:58
回答 1查看 1.3K关注 0票数 2

我看到了多个问题,这些问题涉及使用woodstox和JAXB解析xmls、使用XMLStreamReader解除封送和对schemas.Reading进行验证,尽管它们没有帮助。我需要的是使用本地DTD验证传入的xml,并将整个内容解析为对象表示。传入的xml可以有一个DOCTYPE,其中包含一个DTD。这需要跳过,需要使用本地DTD。实施应该非常迅速。期望< 1ms来进行验证和解析。我可以在5ms中单独使用以下内容进行解析。集成验证不适用于设置模式(注释代码行)

代码语言:javascript
复制
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();
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 17:02:02

有多种方法可以做到这一点;要获得更深入的答案,最好的方法是在Woodstox用户列表上问这个问题(参见http://xircles.codehaus.org/projects/woodstox/lists)。

但是有一点要注意的是,JAXB对Stax2一无所知(Woodstox/Aalto扩展到basic ),所以您需要通过Stax2 API访问它,而不是JAXB。因此,要启用“外部”验证,需要调用:

代码语言:javascript
复制
xmlStreamReader2.validateAgainst(schemaFromDTD);

在构建流读取器(需要转换为XMLStreamReader2,或至少转换到Validatable)之后,您可以立即这样做。请注意,您可以在阅读或写入时验证,两者的工作方式类似(在后一种情况下,您通过XMLStreamWriter启用它)。

另一种可能是定义XMLResolver属性(参见XMLInputFactory.RESOLVER)。当尝试读取外部dtd时,即当DOCTYPE包含对外部文件的引用时,将调用它。然后,自定义XMLResolver可以将此读取重定向到使用其他源。

请注意,第一种方法(您开始使用的方法)可能更有效,因为它只需要读取一次并解析Schema一次,假设您只读取一次,然后再使用它。验证本身应该是快速的,如果解析需要4毫秒,则不应该超过1毫秒;特别是如果您在4毫秒内包含JAXB处理(这是技术上的数据绑定,高于较低层次的解析)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18353595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档