Пример:

У нас есть простейший 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

 

 

 

Реклама