JAXB有多灵活?

Kev*_*dge 2 jaxb

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

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

JAXB可以实现这种灵活性吗?目前,如果未提供命名空间,则无法解析.

bdo*_*han 5

JAXB有多灵活?

非常

因此,我希望能够灵活地处理没有命名空间的文件或指定旧版本的命名空间,并且实际上可能包含无效元素.

NamespaceFilter

下面是一个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);
    }

}
Run Code Online (Sandbox Code Playgroud)

演示

下面是如何将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();
    }

}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息