2010-07-24 50 views
0

在我的代码中,我尝试使用XPath访问我的'处理程序'XML元素,但我没有运气 - 'elemHandler'元素始终为空。任何人都可以与我分享明显的解决方案?提前致谢。使用JDom的XPath

import java.io.IOException; 
import java.io.StringReader; 

import org.jdom.Element; 
import org.jdom.JDOMException; 
import org.jdom.input.SAXBuilder; 
import org.jdom.xpath.XPath; 

public class XPathTest { 
    private static String jobString = "<job name=\"Workflow.JOB\">" + 
              " <handler name=\"xslt.converter\"/>" + 
              " <handler name=\"openoffice.renderer\">" + 
              " <opts input=\"ODS\" output=\"PDF\"/>" + 
              " </handler>" + 
              "</job>"; 

    public static void main(String[] args) { 
    try { 
     Element elemJobInfo = new SAXBuilder().build(new StringReader(jobString)).detachRootElement(); 
     XPath handlerExpression = XPath.newInstance("//stp:handler[2]"); 
     handlerExpression.addNamespace("stp", "http://service.mine.org/dgs"); 
     Element elemHandler = (Element) handlerExpression.selectSingleNode(elemJobInfo); 
     jobString = elemHandler.toString(); 
    } 
    catch (IOException e) { 
     System.out.println("Failure: " + e); 
    } 
    catch (JDOMException e) { 
     System.out.println("Failure: " + e); 
    } 
    catch (Exception e) { 
     System.out.println("Failure: " + e); 
    } 
} 
} 

回答

1

怎么了stp命名空间? jobString中的XML不引用任何名称空间。你是否尝试过没有前缀?

//handler[2] 
+0

是的,我有。研究表明,XPath不适用于不合格和/或默认名称空间。你必须提供一个。 – user5257774 2010-07-24 21:44:58

+1

XPath确实可以使用默认名称空间。我知道的唯一的命名空间问题是它不尊重'xmlns =“some-uri”'声明。如果您更改文档中的空白前缀,XPath将忽略它;它需要一个名称空间前缀,用于不在默认名称空间中的元素。例如,在XHTML文档中,不能使用'/ html'来匹配'''。 – 2010-07-24 22:38:13

1

抵靠该XPath表达式的XML文档:

//stp:handler[2]

进行评价时,没有缺省或声明的名称空间和各节点“没有命名空间”。 "http://service.mine.org/dgs"命名空间中没有任何节点。除非您在实际情况下使用另一个XML文档,否则上述表达式不得选择任何节点 - 这正是您所得到的结果。

如果您使用的文档没有显示,确实有一个默认的命名空间,那么您可能拼错了Java代码中的命名空间。

另外,不要试试你的XPath表达式的这种变化(有或没有命名空间的前缀):

(//stp:handler)[2]

+0

谢谢迪米特雷。我确实尝试过这种变化,但没有奏效。在这一点上,我尝试了许多变体,包括完全命名空间的XML文档等。 在我迄今为止发布的任何论坛中,除了你以外的每个人似乎都对智力战更感兴趣,而不是对某些有用的东西感兴趣。我希望有人能够使用代码片段,抓住jdom.jar和jaxen.jar,并告诉我这应该如何工作。 – user5257774 2010-07-24 23:04:49

+0

@topsquire:不幸的是,我不使用Java。如果它是C#或MSXML DOM,我将能够提供帮助。这似乎不是XPath问题,因为在任何其他环境中,非名称空间表达式都会选择节点。很可能你没有使用Java XPath API。请查阅可用的文档 - 通常包含您可能遵循的示例。另外,您可以在Java相关的论坛中提问。 我*可以*向您证明哪些节点是由特定的XPath表达式选择的 - 通过在XSLT是承载XPath的语言的环境中对它们进行评估。 – 2010-07-24 23:31:33