2017-02-17 22 views
0

Мне нужен простой пример, как можно разбирать XML-файлы с помощью парсера Java DOM и Apache JxPath. Я знаком с DOM-парсером, но теперь я пытаюсь интегрировать JxPath в свой источник.Как разобрать XML-файл с парсером JxPath и DOM

Я искал в сети, но я не могу найти рабочий пример.

Для теста я получил этот XML:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd gender="male"> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd gender="male"> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

Java код:

File file = new File("Files/catalog.xml"); 
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
try 
{ 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(file); 

    NodeList nList = doc.getElementsByTagName("cd"); 
    for(int j = 0; j<nList.getLength(); j++){ 

     Element element = (Element)nList.item(j); 
     System.out.println(element.getElementsByTagName("artist").item(0).getTextContent() + "\n"); 

    } 

} 
catch (ParserConfigurationException | SAXException | IOException e) 
{ 
    e.printStackTrace(); 
} 

Я прочитал для классов Container, DocumentContainer и JXPathContext, но буду благодарен за некоторая помощь или для веб-источника с конкретным рабочим примером.

ответ

2

Вот пример, который аналогичен вашей работе.

File file = new File("Files/catalog.xml"); 
DocumentContainer dc = new DocumentContainer(file.toURI().toURL()); 
JXPathContext ctx = JXPathContext.newContext(dc); 
Iterator iter = ctx.iterate("//cd/artist"); 
//In this case, following API will return DOM object 
//Iterator iter = ctx.selectNodes("//cd/artist").iterator(); 
while (iter.hasNext()) { 
    System.out.println(iter.next());//object type is String 
} 
1

Вы уверены, что JXPath - это то, что вам нужно? JXPath - это библиотека Apache для использования выражений XPath для вещей, которые не обязательно являются XML, такими как деревья объектов Java или карты. Если вы создали DOM из своего XML, вы можете использовать стандартную реализацию Java XPath на нем. См. Здесь: https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathFactory.html. Фактически, JXpath будет работать против вас здесь, потому что DOM имеет дерево таких объектов, как Element и Text с метаданными, такими как имя элемента. Поэтому вместо получения выражения типа //cd/artist вы получаете что-то вроде //*[@tagName='cd']/childNodes[@tagName='artist'].

Теперь, если вы по какой-то причине должны иметь возможность использовать выражения XPath для чего-то, что может быть либо деревом объектов Java, либо DOM, не зная об этом, в этом случае JXPath будет хорошим использованием как описано в их ответе: используя JXPath DocumentContainer для доступа к документу.

0

Да я прочитал за JxPath от нескольких часов, и теперь я понимаю логику этого API

Большое спасибо за ответы. Вот несколько кодов от меня

public class Main { 
    private final static Logger log = Logger.getLogger(Main.class); 

    public static void main(String[] args) { 

     PropertyConfigurator.configure("log4j.properties"); 

     File file = new File("students.xml"); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     try 
     { 
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(file); 

      NodeList nList = doc.getElementsByTagName("cd"); 
      for(int j = 0; j<nList.getLength(); j++){ 

       Element element = (Element)nList.item(j); 

       JXPathContext context = JXPathContext.newContext(element); 
       log.debug(context.getValue("company/address/city[2]")); 

      } 

     } 
     catch (ParserConfigurationException | SAXException | IOException e) 
     { 
      e.printStackTrace(); 
     } 

    }