我正在尝试使用XPATH从XML获取值。我收到以下例外:
[Fatal Error] books.xml:4:16: The prefix "abc" for element "abc:priority" is not bound.
Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:///D:/XSL%20TEST%20APP%20BACK%20UP/XMLTestApp/books.xml; lineNumber: 4; columnNumber: 16; The prefix "abc" for element "abc:priority" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at xpath.XPathExample.main(XPathExample.java:18)
我收到此错误是因为我的XML与正常的XML略有不同(请参阅下文):
<?xml version="1.0" encoding="UTF-8"?>
<inventory>
<Sample>
<abc:priority>1</abc:priority>
<abc:value>2</abc:value>
</Sample>
</inventory>
以下是从上面的XML获取值的代码(Java):
import java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
public class XPathExample {
public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("books.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr
= xpath.compile("//Sample/*/text()");////book/Sample[author='Neal Stephenson']/title/text()
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
}
}
如果我删除分号,我从未收到此错误。
是否可以使用XPATH从上面提到的XML获取内容?
答案 0 :(得分:2)
“是否可以使用Xpath从上面提到的XML获取内容?” - 我不这么认为。这个XML格式不正确。
来自规范(http://www.w3.org/TR/REC-xml-names/#ns-qualnames):
前缀提供限定名称的名称空间前缀部分, 并且必须与命名空间中的命名空间URI引用相关联 宣言。 [定义:LocalPart提供了本地部分 合格的名称。]
为了对它做任何事情,我认为你必须添加名称空间声明。
示例强>
<inventory xmlns:abc="x">
<Sample>
<abc:priority>1</abc:priority>
<abc:value>2</abc:value>
</Sample>
</inventory>
答案 1 :(得分:1)
尝试不用这一行:
domFactory.setNamespaceAware(true); // never forget this!
虽然在没有命名空间感知的情况下运行通常是一个坏主意,但在这种特定情况下它是有道理的,因为输入文件就是这样。