0

我已经看过很多关于 Java/XPath 和 Namepsaces 主题的讨论,但我不确定这些问题的答案是否有助于解决我的特定问题。

我有一个获取一些 XML 的程序 - 我不知道预先的格式,但它可能包含名称空间。用户可以提供用于从 XML 中提取特定数据的 xpath 表达式。代码是通用的——我不能在任何命名空间或类似的东西中编译,因为我不知道预先 XML 的格式。

所以 XML 可能看起来像这样:

<ns1:item id='myroot' xmlns:ns1='http://www.myplace.com/place'>
    <ns1:category id='cat1'>
        <ns1:item id='item1'>
            <ns1:category id='cat2'></ns1:category>
        </ns1:item>
    </ns1:category>
</ns1:item>

用户输入的 xpath 可能是:

/ns1:item[@id='myroot']/ns1:category[@id='cat1']

但是使用以下代码,我总是什么也得不到(无论我尝试什么 XPath):

public static String evaluate(String xml, String xpathExpression) throws Exception
{
    String result = "";
    InputSource is = new InputSource(new StringReader(xml));
    XPath xPath = XPathFactory.newInstance().newXPath();
    result = xPath.evaluate(xpathExpression, is);
    System.out.println("result=" +result);
}

非常感谢任何帮助。

谢谢

4

2 回答 2

2

本质上,像

/ns1:item[@id='myroot']/ns1:category[@id='cat1']

除非您知道 ns1 指的是什么,否则它是没有意义的。因此,如果用户以这种形式提供表达式,那么他们还需要告诉您 ns1 的含义。

XPath 3.0(终于)提供了一种定义 XPath 表达式的方法,它不依赖于知道前缀绑定:您可以编写

/Q{http://www.myplace.com/place}item[@id='myroot']/Q{http://www.myplace.com/place}category[@id='cat1']

但是在 1.0 和 2.0 中实现这一点的唯一方法是编写

/*[local-name()='item' and namespace-uri()='http://www.myplace.com/place'][@id='myroot']/*[local-name()='category' and namespace-uri()='http://www.myplace.com/place'][@id='cat1']
于 2013-03-19T08:16:15.140 回答
1

“MadProgrammer”的评论帮助我找到了我正在寻找的答案:

String result = "";

DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();

xmlFactory.setNamespaceAware(false);

DocumentBuilder builder = xmlFactory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xml));
Document document = builder.parse(is);
XPath xPath = XPathFactory.newInstance().newXPath();

result = xPath.evaluate(xpathExpression, document);

return result;

谢谢。

于 2013-03-20T13:52:54.843 回答