В этом руководстве по Java показано, как с помощью XPath получить соответствующие узлы для значения атрибута в XML-документе.
1. Выражения XPath
1.1 Входной XML-файл
Сначала посмотрим на 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></employees>
1.2 Выражения XPath
Теперь рассмотрим несколько примеров построения выражения XPath.
Описание | XPath |
---|---|
Получить все идентификаторы сотрудников | /сотрудники/сотрудник/@id |
Получить всех сотрудников с идентификатором, равным 1 | /сотрудники/сотрудник[@id = 1] |
Получить всех сотрудников с идентификатором больше 1 | /сотрудники/сотрудник[@id > 1] |
Получить всех сотрудников с идентификатором, содержащим 1 | /employees/employee[содержит(@id,'1')] |
Получить отдел всех сотрудников с идентификатором, содержащим 1 | /employees/employee[содержит(@id,'1')]/department |
Получить имя, идентификатор которого содержит «1» в любом дочернем узле | потомок-или-я::*[содержит(@id,'1')]/firstName/text() |
2. Использование XPath для поиска узлов для указанного значения атрибута
Давайте рассмотрим код, который использовался для оценки приведенных выше выражений XPath с целью выбора узлов, имеющих определенные значения атрибутов.
2.1.Оценка XPath
Чтобы оценить xpath в Java, нам необходимо выполнить следующие шаги:
- Считать XML-файл в org.w3c.dom.Document.
- Создайте XPathFactory с его статическим методом newInstance().
- Получить экземпляр XPath из XPathFactory. Этот объект обеспечивает доступ к среде оценки XPath и выражениям.
- Создайте строку выражения xpath. Преобразуйте строку xpath в объект XPathExpression с помощью метода xpath.compile().
- Оцените xpath по отношению к экземпляру документа, созданному на первом шаге. Он вернет список узлов DOM из документа.
- Выполните итерацию узлов и получите тестовые значения с помощью метода getNodeValue().
Следующий код создает узел DOM для XML-файла.
Выражение XPath не является потокобезопасным. Приложение отвечает за то, чтобы один объект XPathExpression не использовался более чем из одного потока в любой момент времени, и пока вызывается метод оценки, приложения не могут рекурсивно вызывать метод оценки.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setNamespaceAware(true);DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("employees.xml");
Далее следующая функция принимает модель DOM и выражение XPath и возвращает все значения, полученные в результате вычисления выражения.
private static List<String> evaluateXPath(Document document, String xpathExpression) {XPathFactory xpathFactory = XPathFactory.newInstance();XPath xpath = xpathFactory.newXPath();List<String> values = new ArrayList<>();try {XPathExpression expr = xpath.compile(xpathExpression);NodeList nodes =(NodeList) expr.evaluate(document, XPathConstants.NODESET);for(int i = 0; i < nodes.getLength(); i++) {//Customize the code to fetch the value based on the node type and hierarchyvalues.add(nodes.item(i).getNodeValue());}} catch(XPathExpressionException e) {e.printStackTrace();}return values;}
2.2 Пример
Теперь мы можем проверить выражения, которые мы обсуждали в первом разделе. Найти значение атрибута id для всех сотрудников.
String xpathExpression = "/employees/employee/@id";evaluateXPath(document, xpathExpression);
Вывод программы:
[1, 2]
Напишите мне ваши вопросы, связанные с тем, как найти элемент XML со значением атрибута с помощью xpath.