2013-03-18 46 views
0

我已经在Java/XPath和Namepsaces这个主题上看到了相当多的讨论,但我不确定这些问题的答案可以帮助解决我的特定问题。XML格式未知时的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'] 

,但与下面的代码,我总是得到什么(不管什么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); 
} 

任何帮助非常感谢。

感谢

+1

您可以禁用命名空间支持,但在运动前我没有实际的代码。这是一个单一的行,所以一点点,但谷歌搜索应该为你解决它 – MadProgrammer 2013-03-18 20:24:45

+0

谢谢你。我将代码更改为此,并且所有工作都正常: '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); 返回结果;' – user265330 2013-03-19 10:24:07

+0

是的,这看起来是正确的 – MadProgrammer 2013-03-19 10:32:34

回答

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'] 
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; 

谢谢。