2016-01-25 3 views
1

Я пытаюсь разобрать следующий XML и создавать объекты Java, соответствующие основные элементы:ВТД-XML разбор несколько вхождений элемента

<bookCase> 
    <material>wood</material> 
    <shelves>12</shelves> 
    ... 
    <listOfBooks> 
     <book name="book1"> 
     <author>someone</author> 
     <pages>200</pages> 
     ... 
     </book> 
     <book name="book2"> 
     <author>someone else</author> 
     <pages>500</pages> 
     ... 
     </book> 
</bookCase> 

Так что я хочу создать Java объектов BOOKCASE, который содержит список объектов книги.

Я пытаюсь использовать AutoPilot с XPath, но хотя я могу добраться до основных значений (material = "wood", shelves = "12"), я не знаю, как проходить через listOfBooks и создавать два объекта Book. Есть идеи?

С помощью простого метода ниже я могу получить индекс двух элементов книги, но что я с ними?

private List<Integer> getBooksNodes() throws VTDException { 
    final String xpath = "/bookCase/listOfBooks/book"; 
    ap.selectXPath(xpath); 
    final List<Integer> nodeList = new ArrayList<>(); 
    int node; 
    while ((node = ap.evalXPath()) != -1) nodeList.add(node); 
    ap.resetXPath(); 
    return nodeList; 
} 

Как сказать автопилот, чтобы исследовать значения для «автора» XPath и «страницы» для каждой книги по отдельности, так что я могу создать книгу объекта каждый раз, когда автопилот закончил исследовать этот раздел?

+0

Простой ответ заключается в используйте API-интерфейс курсора объекта VTDNav ... скоро напишите и заполните ответ. –

+0

Я ответила на ваш вопрос? –

ответ

0

Ok, ниже код для изучения автора и страницы узлов ... Я не делает предположение о том, что книга узел должен иметь авторские или страницы узлов ...

private List<Integer> getBooksNodes(VTDNav vn) throws VTDException { 
    final String xpath = "/bookCase/listOfBooks/book"; 
    ap.selectXPath(xpath); 
    final List<Integer> nodeList = new ArrayList<>(); 
    int node; 
    while ((node = ap.evalXPath()) != -1) { 
     nodeList.add(node); 
     // the logic that browses the pages and author nodes 
     // just print em out... 
     // remember vn is automatically moved to the xpath output by 
     // autoPilot 
     // we are gonna move the cursor manually now 
     if (vn.toElement(FIRST_CHILD,"author")){ 
      int i = vn.getText(); 
      if (i!=-1) 
       System.out.println(" author is ====>" + vn.toString(i)); 
      vn.toElement(PARENT); 
     } 

     if (vn.toElement(FIRST_CHILD,"pages")){ 
      int i = vn.getText(); 
      if (i!=-1) 
       System.out.println(" author is ====>" + vn.toString(i)); 
      vn.toElement(PARENT); 
     } 

     // also remember that in a xpath eval loop, if you are gonna 
     // move the cursor manually 
     // the node position going into the cursor logic must be identical 
     // to the node position existing the cursor logic 
     // an easy way to accomplish this is 
     // vn.push() ; 
     // your code that does manual node traversal 
     // vn.pop(); 
     // but the logic above didn't use them 
     // because move cursor to child, then moving back, essentially move 
     // the cursor to the original position 
    } 
    ap.resetXPath(); 
    return nodeList; 
} 
Смежные вопросы