如何使用 xpath 在 xml 中获取属性值的简单示例在爪哇。我们将学习获取信息以匹配属性值、范围内的属性值、xpath attribute contains() 等等。
首先查看我们将读取的 XML 文件,然后使用 xpath 查询 从中获取信息。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <employees> <employee id="1"> <firstName>Lokesh</firstName> <lastName>Gupta</lastName> <department> <id>101</id> <name>IT</name> </department> </employee> <employee id="2"> <firstName>Brian</firstName> <lastName>Schultz</lastName> <department> <id>102</id> <name>HR</name> </department> </employee> <employee id="3"> <firstName>Alex</firstName> <lastName>Kolenchisky</lastName> <department> <id>103</id> <name>FINANCE</name> </department> </employee> <employee id="4"> <firstName>Amit</firstName> <lastName>Jain</lastName> <department> <id>104</id> <name>HR</name> </department> </employee> <employee id="5"> <firstName>David</firstName> <lastName>Beckham</lastName> <department> <id>105</id> <name>DEVOPS</name> </department> </employee> <employee id="6"> <firstName>Virat</firstName> <lastName>Kohli</lastName> <department> <id>106</id> <name>DEVOPS</name> </department> </employee> <employee id="7"> <firstName>John</firstName> <lastName>Wick</lastName> <department> <id>107</id> <name>IT</name> </department> </employee> <employee id="8"> <firstName>Mike</firstName> <lastName>Anderson</lastName> <department> <id>108</id> <name>HR</name> </department> </employee> <employee id="9"> <firstName>Bob</firstName> <lastName>Sponge</lastName> <department> <id>109</id> <name>FINANCE</name> </department> </employee> <employee id="10"> <firstName>Gary</firstName> <lastName>Kasporov</lastName> <department> <id>110</id> <name>IT</name> </department> </employee> </employees>
现在看一些如何构建 xpath 以获取基于属性的信息的示例。
<正文>
描述 | XPath | 结果 |
---|---|---|
获取所有员工id | <代码>/employees/员工/@id | [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
获取HR部门所有员工id | /employees/employee[部门/名称='HR']/@id |
[2, 4, 8] |
获取'Alex'的员工id | /employees/employee[firstName='亚历克斯']/@id |
[3] |
获取大于5的员工id | /employees/employee/@id[. > 5] |
[6, 7, 8, 9, 10] |
获取id包含'1'的员工 | /employees/employee[包含(@id,'1')]/firstName/text() |
[洛克什,加里] |
获取id为1的员工 | 后裔或自我::*[contains(@id,'1')]/firstName/text() |
[洛克什,加里] |
让我们看一下用于评估上述 xpath 表达式以选择具有特定属性值的节点的代码。
要在 java 中评估 xpath,您需要执行以下步骤:
org.w3c.dom.Document
。XPathFactory
及其 newInstance()
静态方法。XPath
来自 XPathFactory
的实例。此对象提供对 xpath 评估环境和表达式的访问。XPathExpression
对象使用 xpath.compile()
方法。getNodeValue()
方法获取测试值。XPath 表达式不是线程安全的。应用程序有责任确保在任何给定时间不从多个线程使用一个
XPathExpression
对象,并且在调用 evaluate 方法时,应用程序不得递归调用 evaluate 方法。< /p>
package com.cundage.demo; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; public class XPathExample { public static void main(String[] args) throws Exception { //Get DOM Node for XML String fileName= "employees.xml"; Document document = getDocument(fileName); String xpathExpression = ""; /*******Get attribute values using xpath******/ //Get all employee ids xpathExpression = "/employees/employee/@id"; System.out.println( evaluateXPath(document, xpathExpression) ); //Get all employee ids in HR department xpathExpression = "/employees/employee[department/name='HR']/@id"; System.out.println( evaluateXPath(document, xpathExpression) ); //Get employee id of 'Alex' xpathExpression = "/employees/employee[firstName='Alex']/@id"; System.out.println( evaluateXPath(document, xpathExpression) ); //Get employee ids greater than 5 xpathExpression = "/employees/employee/@id[. > 5]"; System.out.println( evaluateXPath(document, xpathExpression) ); //Get employee whose id contains 1 xpathExpression = "/employees/employee[contains(@id,'1')]/firstName/text()"; System.out.println( evaluateXPath(document, xpathExpression) ); //Get employee whose id contains 1 xpathExpression = "descendant-or-self::*[contains(@id,'1')]/firstName/text()"; System.out.println( evaluateXPath(document, xpathExpression) ); } private static List<String> evaluateXPath(Document document, String xpathExpression) throws Exception { // Create XPathFactory object XPathFactory xpathFactory = XPathFactory.newInstance(); // Create XPath object XPath xpath = xpathFactory.newXPath(); List<String> values = new ArrayList<>(); try { // Create XPathExpression object XPathExpression expr = xpath.compile(xpathExpression); // Evaluate expression result on XML document NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET); for (int i = 0; i < nodes.getLength(); i++) { values.add(nodes.item(i).getNodeValue()); } } catch (XPathExpressionException e) { e.printStackTrace(); } return values; } private static Document getDocument(String fileName) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(fileName); return doc; } }
程序输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 4, 8] [3] [6, 7, 8, 9, 10] [Lokesh, Gary] [Lokesh, Gary]
@XmlRootElement(name="employees") @XmlAccessorType(XmlAccessType.FIELD) public class Employees implements Serializable { private static final long serialVersionUID = 1L; @XmlElement(name="employee") private List<Employee> employees; public List<Employee> getEmployees() { if(employees == null) { employees = new ArrayList<Employee>(); } return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } @Override public String toString() { return "Employees [employees=" + employees + "]"; } }
@XmlRootElement(name="employee") @XmlAccessorType(XmlAccessType.FIELD) public class Employee implements Serializable { private static final long serialVersionUID = 1L; @XmlAttribute private Integer id; private String firstName; private String lastName; private Department department; public Employee() { super(); } public Employee(int id, String fName, String lName, Department department) { super(); this.id = id; this.firstName = fName; this.lastName = lName; this.department = department; } //Setters and Getters @Override public String toString() { return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", department=" + department + "]"; } }
@XmlRootElement(name="department") @XmlAccessorType(XmlAccessType.FIELD) public class Department implements Serializable { private static final long serialVersionUID = 1L; Integer id; String name; public Department() { super(); } public Department(Integer id, String name) { super(); this.id = id; this.name = name; } //Setters and Getters @Override public String toString() { return "Department [id=" + id + ", name=" + name + "]"; } }
将有关如何使用 xpath 查找具有属性值的 xml 元素的问题交给我。
快乐学习!!
地址:https://www.cundage.com/article/xpath-attribute-evaluate.html