java中的xpath提取所有xml元素

Luc*_*ucy 0 java xpath

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

谢谢

tit*_*geo 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>
Run Code Online (Sandbox Code Playgroud)

从文档中获取信息

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());
}
Run Code Online (Sandbox Code Playgroud)

上面的红色行是用于编译xPath表达式的行,// @ id是实际的表达式.表达式@@ id将返回文档中属性id的值.即.程序的输出将是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应该用作evaluate方法中的返回类型.
  • / 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年之间的人.检查用红色标记的文本.这是因为元素年不是人的直接孩子而是兄弟姐妹,换句话说,直接的父母是节点.所以我们需要提升一级才能获得元素'名称'.
  • //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()