実際、JavaはそのままXMLを解析するための4つのメソッドをサポートしています。
DOMパーサー/ビルダー:XML構造全体がメモリーにロードされ、よく知られているDOMメソッドを使用してそれを操作できます。DOMでは、Xslt変換を使用してドキュメントに書き込むこともできます。例:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAXパーサー:XMLドキュメントを読み取るためだけです。Saxパーサーはドキュメントを実行し、ユーザーのコールバックメソッドを呼び出します。ドキュメントの開始/終了、要素などのメソッドがあります。これらはorg.xml.sax.ContentHandlerで定義されており、空のヘルパークラスDefaultHandlerがあります。
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAxリーダー/ライター:これはデータストリーム指向のインターフェースで動作します。プログラムは、カーソル/イテレータのように準備が整ったときに次の要素を要求します。それを使ってドキュメントを作成することもできます。ドキュメントを読む:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
文書を書く:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB:XMLドキュメントを読み取るための最新の実装:v2のJava 6の一部です。これにより、ドキュメントからJavaオブジェクトをシリアル化できます。javax.xml.bind.Unmarshallerへのインターフェースを実装するクラスを使用してドキュメントを読みます(JAXBContext.newInstanceからこのクラスを取得します)。コンテキストは使用するクラスで初期化する必要がありますが、ルートクラスを指定するだけで、静的参照クラスを気にする必要はありません。注釈を使用して、どのクラスを要素(@XmlRootElement)にし、どのフィールドを要素(@XmlElement)または属性(@XmlAttribute、なんと驚き!)にするかを指定します。
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
文書を書く:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
いくつかの古い講義のスライドから恥知らずにコピーされた例;-)
編集:「どのAPIを使用すればよいですか?」について。まあそれは依存する-すべてのAPIがあなたが見るのと同じ機能を持っているわけではありませんが、XMLドキュメントをマップするために使用するクラスを制御できる場合、JAXBは私の個人的なお気に入り、本当にエレガントでシンプルなソリューションです(私はそれを使用していません)本当に大きなドキュメントですが、少し複雑になる可能性があります)。SAXも非常に使いやすく、使用する正当な理由がない限り、DOMから離れてください。私の意見では、古くて不格好なAPIです。STLにない特に有用な機能を備えた最新のサードパーティライブラリはないと思います。標準ライブラリには、十分にテストされ、文書化され、安定しているという通常の利点があります。