XML格式未知时的Java XPath命名空间

XML格式未知时的Java XPath命名空间,java,xpath,namespaces,Java,Xpath,Namespaces,我已经看过很多关于Java/XPath和命名的讨论,但我不确定这些问题的答案是否能帮助解决我的特定问题 我有一个程序可以获取一些XML—我不知道前面的格式,但它可能包含名称空间。用户可以提供一个xpath表达式,用于从XML中提取特定数据段。代码是通用的-我不能在任何名称空间或类似的地方编译,因为我事先不知道XML的格式 因此,XML可能如下所示: <ns1:item id='myroot' xmlns:ns1='http://www.myplace.com/place'>

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

我有一个程序可以获取一些XML—我不知道前面的格式,但它可能包含名称空间。用户可以提供一个xpath表达式,用于从XML中提取特定数据段。代码是通用的-我不能在任何名称空间或类似的地方编译,因为我事先不知道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']
除非你知道ns1指的是什么,否则它毫无意义。因此,如果用户以这种形式提供表达式,那么他们还需要告诉您ns1的含义

XPath3.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']

本质上,一个表达式

/ns1:item[@id='myroot']/ns1:category[@id='cat1']
除非你知道ns1指的是什么,否则它毫无意义。因此,如果用户以这种形式提供表达式,那么他们还需要告诉您ns1的含义

XPath3.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']
“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;
谢谢。

来自“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;

谢谢。

您可以禁用名称空间支持,但我在移动时没有实际的代码。这是一条单行线,所以一点谷歌搜索应该能帮你解决这个问题谢谢。我将代码更改为此,所有工作正常:
stringresult=“”;DocumentBuilderFactory xmlFactory=DocumentBuilderFactory.newInstance();setNamespaceAware(false);DocumentBuilder=xmlFactory.newDocumentBuilder();InputSource is=新的InputSource(新的StringReader(xml));Document=builder.parse(is);XPath=XPathFactory.newInstance().newXPath();result=xPath.evaluate(xpathExpression,document);返回结果是的,看起来不错。你可以禁用名称空间支持,但在移动时我面前没有实际的代码。这是一条单行线,所以一点谷歌搜索应该能帮你解决这个问题谢谢。我将代码更改为此,所有工作正常:
stringresult=“”;DocumentBuilderFactory xmlFactory=DocumentBuilderFactory.newInstance();setNamespaceAware(false);DocumentBuilder=xmlFactory.newDocumentBuilder();InputSource is=新的InputSource(新的StringReader(xml));Document=builder.parse(is);XPath=XPathFactory.newInstance().newXPath();result=xPath.evaluate(xpathExpression,document);返回结果是的,看起来不错