0
xmlに名前空間はありますが、プレフィックスはありません。私はxpathsを持っていますが、Schematronから生成された接頭辞を持っています。私は接頭辞付きのxpathを使ってそのXMLから要素の詳細を取得したい。ここでXpathを使用してXmlを名前空間で解析する方法java
は私が
HashMap<String, String> prefMap = new HashMap<String, String>() {
{
put("q", "foo");
}
};
MyNameSpaceContext namespaces = new MyNameSpaceContext(prefMap);
xPath.setNamespaceContext(namespaces);
を試してみましたが、ここにMyNameSpaceContext
でてきたので、私はNameSpaceContextインタフェースについて読み、私のXML<?xml version="1.0" encoding="UTF-8"?>
<section xmlns="http://foo" type="abc" id="ad">
<title>Document Title</title>
<body>
<p>
<t>Document Body</t>
</p>
<p>
<t>Document Body</t>
</p>
<p>
<t>Document Body</t>
</p>
</body>
</section>
そして、ここでは、Javaコード
package com;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XPathTest {
public static void main(String[] args) {
File inputFile = new File("files/my_xml.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
HashMap<String, String> prefMap = new HashMap<String, String>() {
{
put("q", "http://foo");
}
};
SmartContentNameSpaceContext namespaces = new SmartContentNameSpaceContext(prefMap);
xPath.setNamespaceContext(namespaces);
String expression = "//q:section[1]";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
System.out.println(node.getAttributes().item(0));
System.out.println("current element : " + node.getNodeName());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
です
package com;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.namespace.NamespaceContext;
public class MyNameSpaceContext implements NamespaceContext {
private final Map<String, String> PREF_MAP = new HashMap<String, String>();
public SmartContentNameSpaceContext(final Map<String, String> prefMap) {
PREF_MAP.putAll(prefMap);
}
@Override
public String getNamespaceURI(String prefix) {
return PREF_MAP.get(prefix);
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
}
しかし、これはうまくいきませんか?