この場合、rdf:
の部分を無視して、/RDF/channel/items/Seq/li
としてしまえば読み出すことはできます。
いちおう、名前空間を認識させる処理も書いておきます。
名前空間を処理するには、NamespaceContext
というインターフェイスを実装します。
ただこの場合、NamespaceContext
があってもなくても動作するので、正しいのかどうかちょっと怪しいです。
- JavaでRSS1.0の要素(channel/items)を読み込むサンプル
lang
1// import java.io.*;
2// import java.util.*;
3// import javax.xml.namespace.NamespaceContext;
4// import javax.xml.parsers.*;
5// import javax.xml.xpath.*;
6// import org.w3c.dom.*;
7// import org.xml.sax.SAXException;
8
9// XML(RDF)ファイル
10File file = new File("./data.xml");
11
12// RDFのNamespaceContext実装
13NamespaceContext nsc = new NamespaceContext() {
14 final String prefix = "rdf";
15 final String uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
16 @Override
17 public Iterator<?> getPrefixes(String namespaceURI) {
18 return Arrays.asList(prefix).iterator();
19 }
20 @Override
21 public String getPrefix(String namespaceURI) {
22 if (uri.equals(namespaceURI)) {
23 return prefix;
24 }
25 return "";
26 }
27 @Override
28 public String getNamespaceURI(String prefix) {
29 if (this.prefix.equals(prefix)) {
30 return uri;
31 }
32 return "";
33 }
34};
35
36// XMLパース
37Document doc;
38try {
39 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
40 DocumentBuilder builder = factory.newDocumentBuilder();
41 doc = builder.parse(file);
42} catch (ParserConfigurationException | SAXException | IOException e) {
43 throw new RuntimeException(e);
44}
45
46// XPath適用
47XPathFactory xPathFactory = XPathFactory.newInstance();
48XPath xpath = xPathFactory.newXPath();
49xpath.setNamespaceContext(nsc);
50NodeList nodes;
51try {
52 XPathExpression expr = xpath.compile("/RDF/channel/items/Seq/li");
53 nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
54} catch (XPathExpressionException e) {
55 throw new RuntimeException(e);
56}
57for (int i = 0; i < nodes.getLength(); i++) {
58 Node node = nodes.item(i);
59 NamedNodeMap map = node.getAttributes();
60 for (int j = 0; j < map.getLength(); j++) {
61 System.out.println(map.item(j));
62 }
63}
参考リンク:
XPathで名前空間URIを使う - (旧)サンフラットの開発日記
http://d.hatena.ne.jp/sunflat/20080430/p2
NamespaceContext
- Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/javax/xml/namespace/NamespaceContext.html
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/09 07:22