gpt4 book ai didi

java - 支持 SAX 2.0 compilant 解析器

转载 作者:行者123 更新时间:2023-11-29 08:55:27 26 4
gpt4 key购买 nike

我有一个代码,它使用 JAXB 和 SAX 将 xml 源解码为 java 对象。后来我看了this文档并了解到如果我不提供 SAX 解析器,JAXB 提供者将选择默认解析器。默认解析器是什么意思?如果我不提供 SAX 2.0 解析器,它会使用 DOM 或任何其他技术来解析文档吗?或者它会使用低于 2.0 版本的 SAX 解析器。

我们正在使用 javax.xml.bind jaxb-api。我怎么知道它使用哪个 SAX 解析器。如果我一定要将 SAX2.0 compilant 解析器与 JAXB 一起使用,那么有哪些不同的解析器可用。这些困惑是怎么回事?我完全搞砸了。至少我想阅读一份很好的文档,其中解释了解析技术、要使用的解析器以及不同类型的解析器和不同类型的 JAXB 提供程序等。

到现在我只知道JAXB是一个规范。 Oracle 发布的标准 java 给出了规范的默认实现。此外还有其他实现,如 Metro、Eclipselink MOXy、apache camel 的 JAXB 实现。刚才我才知道,如果我理解正确的话,解析技术中使用了不同的解析器版本。

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组。

Later I read this document and came to know that if I dont provide a SAX parser, the JAXB provider will choose a default parser. What does default parser means?

当你问 JAXB (JSR-222)解码类似 InputStream 的实现 JAXB 实现可以自由地解析 XML,因为它认为合适(即 SAX、StAX 或某些专有解析器)。

如果您想强制您的 JAXB 实现使用特定的 SAX 解析器,那么您可以执行以下操作之一:

选项 #1 - UnmarshallerHandler

import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.XMLReader;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(unmarshallerHandler);
xr.parse("input.xml");

Foo foo = (Foo) unmarshallerHandler.getResult();
}

}

选项 #2 - SAXSource

您可以在 XMLReader 上创建 SAXSource 实例,并让 JAXB 从中解码。 JAXB 将使用传入的 XMLReader

import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.sax.SAXSource;
import org.xml.sax.*;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();

InputSource xml = new InputSource("input.xml");

SAXSource saxSource = new SAXSource(xr, xml);
Foo foo = (Foo) unmarshaller.unmarshal(saxSource);
}

}

Till now I only know that JAXB is a specification. Standard java distributed by Oracle gives a default implementation of the specification. Besides there are other implementations like Metro, Eclipselink MOXy, apache camel's JAXB implementation. Just now I came to know that there are different parser versions used in parsing techniques if I understood properly.

最终,了解 JAXB 实现使用哪个底层解析器并不重要(它甚至可以在版本之间更改)。 JAXB 实现需要通过 TCK 并将继续以一致的方式工作。如果您希望它使用特定的 SAX 解析器,请使用上述方法之一。如果您希望它使用 StAX,则将 XMLStreamReader 的实例传递给它以进行解码,如果您希望它使用 DOM,则将其传递给 Document 的实例以进行解码。

关于java - 支持 SAX 2.0 compilant 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20493422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com