Пример:

У нас есть простейший XML:

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book>
		<title>Планиметрия для школы</title>
		<author>Иванов</author>
		<size>52</size>
	</book>
	<book>
		<title>Стереометрия</title>
		<author>Петров</author>
		<size>135</size>
	</book>
	<book>
		<title>Астрономия</title>
		<author>Сидоров</author>
		<size>135</size>
	</book>
</books>

Возьмём из него данные по XPath

import java.io.FileNotFoundException;
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;
import org.xml.sax.SAXException;

public class MyClass {

	public static String takeDataFromXPATH(String myPath, String myXPATH) throws Exception {
		String ret = "";
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document myXML = builder.parse(myPath);
			// фабрика ХPath
			XPathFactory myFactory = XPathFactory.newInstance();
			// создали объект xpath фабрики XPath
			XPath xpath = myFactory.newXPath();
			// тут записан Xpath путь
			XPathExpression expr = xpath.compile(myXPATH);
			Object result = expr.evaluate(myXML, XPathConstants.NODESET);
			// задаем коллекцию nodes;
			NodeList xpathData = (NodeList) result;

			for (int i = 0; i < xpathData.getLength(); i++) {
				ret += xpathData.item(i).getNodeValue() + "\r\n";
			}
		} catch (FileNotFoundException e) {
			System.out.println("Файл " + myPath + "не существует");
			return null;
		} catch (SAXException e) {
			System.out.println("XML не корректный");
			return null;
		} catch (XPathExpressionException e) {
			System.out.println("Ошибка в Xpath");
			return null;
		}
		return ret;
	}

	public static void main(String[] args) throws Exception {

		String dataXPath = MyClass.takeDataFromXPATH("C:\\myFirstXML.xml", "//books/book/title/text()");
		System.out.println("dataXPath = " + dataXPath);
	}
}

Недостатки:

1. Если ХPath будет содержать тэги, которых нет в XML, то не будет ошибки. Например, ХPath будет таким //booooooooooooooooooooks/book/title/text(), то dataXPath будет равна пусто

2. Если мы будет возвращаем список, т.е. несколько значений, то потом все равно придется разбивать данные через split

3. Использовать перенос строки «\r\n» в качестве разделителя, т.к. во-первых, XML уже может содержать переносы строк, а во-вторых, будут проблемы с работой под разными операционками, например, Linux

Реклама