XML操作関連

トップ > チップス > XML操作関連
2012-02-13, xml

/tips/java/xml **XPath ***特定のElementを取り出す 以下のようなxml文書を想定します。 : : : : : :

要素(Element)"c"の属性値が欲しいような場合にXPathを使った記述は以下のようになります。 :XPath xpath = XPathFactory.newInstance().newXPath(); :Element c = (Element) xpath.evaluate("/a/b/c", doc.getDocumentElement(), XPathConstants.NODE); :System.out.println(c.getAttribute("foo")); // bar

***特定のノードリストを取り出す 上記例と同じケースで、複数の要素(ノードリスト)を取り出したい場合は以下のような記述になります。 :NodeList items = : (NodeList) xpath.evaluate("/a/b/c", : doc.getDocumentElement(), XPathConstants.NODESET);

***属性に注目してノードを取り出す ノードの階層だけでなく特定の属性を指定してノードを選択することも可能です。以下のような文字列で指定します。

:/a/b/c[@foo='bar']

-{link:http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt02.html}

***要素内の文字列を取り出す text()という記述を使用します。

:/a/b/c/text()

-{link:http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt02.html}

**DOM ***シリアライズする :Transformer t = TransformerFactory.newInstance().newTransformer(); :t.setOutputProperty(OutputKeys.INDENT, "yes"); :DocumentType dc = document.getDoctype(); :if (dc != null) { : t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, dc.getPublicId()); : t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, dc.getSystemId()); :} :t.transform(new DOMSource(document), new StreamResult(os));

***DTDを無視する JDK付属のパーザは、インターネット接続がない環境でも、DTDを読み込もうとしてしまい、(例えXMLが正しくても)エラーを発生させてしまいます。DTDのチェックそのものを無効化するには、以下のようにDocumentBuilderのリゾルバを設定します。nullを返すように設定しても何故かDTDを無視するようには動作はしません。

:db.setEntityResolver(new EntityResolver() { : @Override : public InputSource resolveEntity(String publicId, : String systemId) throws SAXException, IOException { : return new InputSource(new StringReader("")); : } :});

この記事は役に立ちましたか?