備註:我是EclipseLink JAXB (MOXy)的領導者和JAXB (JSR-222)專家組的成員。
後來我讀了這篇文檔,發現如果我沒有提供一個 SAX解析器,JAXB提供者會選擇一個默認的解析器。 默認解析器是什麼意思?
當你問一個JAXB (JSR-222)實施解組類似的InputStream
JAXB的實現可以自由地解析XML作爲它認爲合適(即SAX,StAX的,或一些專有解析器)。
如果要強制JAXB實現使用specfic 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);
}
}
到目前爲止我只知道,JAXB是一種規範。由Oracle分發的標準java 提供了 規範的默認實現。除此之外還有其他的實現,如Metro, Eclipselink MOXy,apache camel的JAXB實現。剛纔我發現 知道如果我理解正確,解析 技術時會使用不同的解析器版本。
最終,知道JAXB實現使用哪個底層解析器並不重要(它甚至可以在不同版本之間進行更改)。JAXB實現需要通過TCK,並將繼續以一致的方式工作。如果您希望它使用特定的SAX解析器,請使用上述方法之一。如果你想讓它使用StAX傳遞一個XMLStreamReader
的實例來取消編組,並且如果你想讓它使用DOM傳遞一個Document
的實例來取消編組。
現在我正在使用選項#2。本部分「使用指定的驗證SAX2.0解析器的客戶端從javax.xml.transform.sax.SAXSource解組」,位於文檔http://docs.oracle.com/javaee/5/api/javax/xml/bind/ Unmarshaller.html讓我困惑。我不明白這是什麼。 –