java中的xpath提取所有xml元素

时间:2012-04-10 11:03:13

标签: java xpath

任何人都可以提供一个使用java中的xpath从xml文件中提取所有元素及其属性和值的示例吗?

由于

2 个答案:

答案 0 :(得分:5)

几年前我为我的团队写了这篇文章。会有所帮助。

什么是xPath?

  1. XPath是一种用于在XML文档中查找信息的语言。
  2. XPath是一种用于定义XML文档部分的语法。
  3. XPath使用路径表达式在XML文档中导航。
  4. XPath包含标准函数库。
  5. XPath是XSLT中的主要元素。
  6. XPath是W3C的推荐。
  7. 在XPath中,有七种节点:元素,属性,文本,名称空间,处理指令,注释和文档(根)节点。 XML文档被视为节点树。树的根称为文档节点(或根节点)。

    考虑以下Xml文档。

    <information>
        <person id="1">
            <name>Tito George</name>
            <age>25</age>
            <gender>Male</gender>
            <dob>
                 <date>25</date>
                 <month>october</month>
                 <year>1983</year>
            </dob>
        </person>
    
    
         <person id="2">
            <name>Kumar</name>
            <age>32</age>
            <gender>Male</gender>
            <dob>
                 <date>28</date>
                 <month>january</month>
                 <year>1975</year>
            </dob>
        </person>
    
    
        <person id="3">
            <name>Deepali</name>
            <age>25</age>
            <gender>Female</gender>
            <dob>
                 <date>17</date>
                 <month>january</month>
                 <year>1988</year>
            </dob>
        </person>
    
    </information>
    

    从文档中获取信息

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    //Getting the instance of DocumentBuilderFactory 
    domFactory.setNamespaceAware(true);
    //true if the parser produced will provide support for XML namespaces; 
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    //Creating document builder
    Document doc = builder.parse("C:\\JavaTestFiles\\persons.xml");
    XPath xpath = XPathFactory.newInstance().newXPath();
    //getting instance of xPath
    expr = xpath.compile("//@id");
    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表达式的行,// @ id是实际的表达式。表达式@@ id将返回文档中属性id的值。即。程序的输出将是1 2和3.在下表中,您可以找到可以在本文档中使用的各种表达式。

    上面代码段中的两个重要声明是

    • expr = xpath.compile(“// @ id”); - &GT;这个编译表达式。 如果不能编译,这个方法将抛出XPathExpressionException。
    • expr.evaluate(doc,XPathConstants.NODESET); - &GT;评估XPath 表达式在指定的上下文中返回结果为 指定的类型。在这里,第二个参数定义了该方法 将返回(returnType)。如果returnType不是其中之一 XPathConstants中定义的类型(NUMBER,STRING,BOOLEAN,NODE或 NODESET)然后抛出IllegalArgumentException。

    基本上: XML文档是树状结构(分层)节点集合。与分层目录结构一样,指定指向层次结构中特定节点的路径(因此指定的名称:XPath)非常有用。

    事实上,目录路径的大部分符号都是完整的:

    • 正斜杠(/)用作路径分隔符。
    • 文档根目录的绝对路径以/.
    • 开头
    • 来自指定地点的相对路径从其他任何地方开始。
    • 双句点(..)表示当前节点的父节点。
    • 单个句点(。)表示当前节点。

    信息

    • // @ id - &gt;选择名为id
    • 的所有属性
    • // @ * - &gt;选择文档中的所有属性节点
    • // @ id ='1' - &gt;测试属性id ='1'的节点是否存在 该文件。如果存在,该陈述将评估为真。在 这种情况下XPathConstants.BOOLEAN应该用作返回类型 在评估方法。
    • / information / person [age = '24'] name / text()或
      // person [age ='24'] name / text() - &gt;返回'Kumar'..让我们分开吧 首先查询:/ information / person [age ='24'] / name / text()第1部分: 搜索元素'age'= 24的节点'person' 第2部分:获取该节点的元素“名称”第3部分:text() - 是一个 xPath函数将返回元素“name”的文本节点 注意:这里,信息是根节点,如果我们从 根节点一个斜杠就足够了,即它是一个绝对路径。如果我们是 从子节点开始使用必须使用双斜杠'//'即它 相对路径。
    • // person / dob [year&gt;'1978'] [year&lt; 1985] /../ name / text() - &gt;这个表达 正在寻找YOB在1978年至1985年之间的人。检查 标有红色的文字。这是因为元素年不是直接的 孩子对于人来说,而不是兄弟姐妹,换句话说是直接的 年度的父母是节点。所以我们需要提升一级 获得元素'名称'。
    • // person / dob [year&gt;'1978'] [year&lt; 1985] /../@ id - &gt;这将返回id 满足上述条件的节点。注意:没必要 调用text()方法获取属性值
    • // person [age = '25'] // dob [date = 25] /../ name / text() - &gt;这个表达会 返回年龄= 25且日期= 25的人的姓名。
    • / information / person [1] / name / text()搜索的名称 第一人称节点。
    • / information / person / dob / child :: / text() - &gt;这将返回所有 dob的子节点。我们也可以这样写 孩子::信息/儿童::人/儿童:: DOB /儿童:: 的/文本()

答案 1 :(得分:3)

以这种方式使用此XPath表达式"//*"

Document doc = ... // the document on which apply XPath
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//*");
NodeList elements = (NodeList) xp.evaluate(doc, XPathConstants.NODESET);

它会返回任何级别的所有元素。