2

XML解析にJAXBを使用することを検討していますが、これまでにいくつかの問題があり、必要なものに対して十分な柔軟性がない可能性があると考えています。

公開するXSDに準拠するために、サードパーティから提供されたXMLを解析します。したがって、名前空間を持たないファイルや、古いバージョンの名前空間を指定し、実際には無効な要素が含まれている可能性のあるファイルを処理するのに十分な柔軟性が必要です。

この種の柔軟性はJAXBで可能ですか?現時点では、名前空間が指定されていない場合、解析に失敗します。

4

1 に答える 1

5

JAXBはどの程度柔軟ですか?

非常に

したがって、名前空間を持たないファイルや、古いバージョンの名前空間を指定し、実際には無効な要素が含まれている可能性のあるファイルを処理するのに十分な柔軟性が必要です。

NamespaceFilter

XmlFilter以下は、欠落している名前空間を適用するために使用できるSAXです。

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);
    }

}

デモ

XMLFilter以下は、 JAXBを使用してSAXを適用する方法の例です。

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();
    }

}

詳細については

于 2013-01-30T18:11:05.920 に答える