jaxb - JAXB 有多灵活?

标签 jaxb

我正在考虑使用 JAXB 进行 XML 解析,但到目前为止我遇到了一些问题,这些问题让我相信它可能不够灵活,无法满足我的需求。

我将解析第三方提供的 XML,以符合我将发布的 XSD。因此,我希望足够灵活,可以处理没有命名空间或指定旧版本命名空间并且实际上可能包含无效元素的文件。

JAXB 可以实现这种灵活性吗?目前,如果未提供 namespace ,则无法解析。

最佳答案

How flexible is JAXB?

非常

So I want to be flexible enough to handle files that don't have namespaces or specify an old version of the namespace and may in fact contain invalid elements.

命名空间过滤器

下面是一个 SAX XmlFilter,可用于应用缺少的命名空间。

import org.xml.sax.*;
import org.xml.sax.helpers.XMLFilterImpl;

public class NamespaceFilter extends XMLFilterImpl {

    private static final String NAMESPACE = "http://www.example.com/customer";

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        super.endElement(NAMESPACE, localName, qName);
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes atts) throws SAXException {
        super.startElement(NAMESPACE, localName, qName, atts);
    }

}

演示

下面是如何将 SAX XMLFilter 与 JAXB 一起应用的示例。

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

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create the JAXBContext
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        // Create the XMLFilter
        XMLFilter filter = new NamespaceFilter();

        // Set the parent XMLReader on the XMLFilter
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        filter.setParent(xr);

        // Set UnmarshallerHandler as ContentHandler on XMLFilter
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        UnmarshallerHandler unmarshallerHandler = unmarshaller
                .getUnmarshallerHandler();
        filter.setContentHandler(unmarshallerHandler);

        // Parse the XML
        InputSource xml = new InputSource("src/blog/namespace/sax/input.xml");
        filter.parse(xml);
        Customer customer = (Customer) unmarshallerHandler.getResult();
    }

}

了解更多信息

关于jaxb - JAXB 有多灵活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609597/

相关文章:

java - @XmlAnyAttribute 和方法有错误吗? (使用 JAXB RI)

jaxb - 使用 JAXB 解码 SOAP 消息

java - 如何生成一个类,从中我可以检索节点的 XML 作为字符串

java - JAXB:我应该如何编码复杂的嵌套数据结构?

java - 为什么 JAXB generateElementProperty=false 没有达到预期的效果?

java - 如何在一行代码中配置 JacksonJaxbJsonProvider?

java - 无法在 mybatis 查询中连接超过 4k 字符

java - 如何解决 java.lang.ClassNotFoundException : org. docx4j.jaxb.ri.NamespacePrefixMapper

java - 持久的与技术无关的Java模型:JAXB与eCore

java - 使用 Jaxb2Marshaller 防止解析包含 DTD 的 XML 文件