0

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

谢谢

4

2 回答 2

6

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

什么是 xPath?

  1. XPath 是一种用于在 XML 文档中查找信息的语言。
  2. XPath 是一种用于定义部分 XML 文档的语法。
  3. XPath 使用路径表达式在 XML 文档中导航。
  4. XPath 包含一个标准函数库。
  5. XPath 是 XSLT 中的主要元素。
  6. XPath 是 W3C 推荐的。

在 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 的值。IE。程序的输出将是 1 2 和 3。在下表中,您可以找到本文档中可以使用的各种表达式。

上述代码片段中的两个重要语句是

  • expr = xpath.compile("//@id"); --> 这个编译表达式。如果不可编译,此方法将抛出 XPathExpressionException。
  • expr.evaluate(doc, XPathConstants.NODESET); --> 在指定的上下文中计算一个 XPath 表达式并将结果作为指定的类型返回。在这个第二个参数定义了方法将返回什么(returnType)。如果 returnType 不是 XPathConstants(NUMBER、STRING、BOOLEAN、NODE 或 NODESET)中定义的类型之一,则抛出 IllegalArgumentException。

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

事实上,目录路径的大部分符号都被原封不动地保留下来:

  • 正斜杠 (/) 用作路径分隔符。
  • 从文档根开始的绝对路径以 / 开头。
  • 从给定位置开始的相对路径以其他任何内容开头。
  • 双句点 (..) 表示当前节点的父节点。
  • 单个句点 (.) 表示当前节点。

信息

  • //@id --> 选择所有名为 id 的属性
  • //@* --> 选择文档中的所有属性节点
  • //@id='1' --> 测试文档中是否存在属性 id = '1' 的节点。如果存在,该语句将评估为真。在这种情况下,XPathConstants.BOOLEAN 应该用作评估方法中的返回类型。
  • /information/person [age='24']name/text() 或
    //person[age='24'] name/text() --> 返回 'Kumar'.. 让我们先拆分查询:/information /person[age='24']/name/text() 第 1 部分:搜索具有元素 'age' = 24 的节点 'person' 第 2 部分:获取该节点的元素 'name' 第 3 部分:文本() -- 是一个xPath函数,将返回元素'name'的文本节点 注意:这里的信息是根节点,如果我们从根节点开始,一个斜杠就足够了,即它是一个绝对路径。如果我们从子节点开始使用必须使用双斜杠'//',即它是一个相对路径。
  • //person/dob[year>'1978'][year<1985]/../name/text() --> 这个表达式正在搜索 YOB 在 1978 到 1985 之间的人。检查标记为红色的文本. 这是因为元素 year 不是 person 的直接子元素,而是兄弟元素,或者换句话说 year 的直接父元素是 node 。所以我们需要上一层来获取元素“名称”。
  • //person/dob[year>'1978'][year<1985]/../@id --> 这将返回满足上述条件的节点的id。注意:不需要调用 text() 方法来获取属性值
  • //person[age='25']//dob[date=25]/../name/text() --> 此表达式将返回年龄 = 25 且日期 = 25 的人的姓名。
  • /information/person[1] /name/text() 搜索第一个人节点的名称。
  • /information/person/ dob/child:: /text() --> 这将返回dob的所有子节点。我们也可以这样写 child::information/child::person/child::dob/child:: /text()
于 2012-04-10T11:25:24.927 回答
4

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

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

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

于 2012-04-10T11:17:59.457 回答