2013-09-05 3 views
0

Я считаю, что это простой вопрос, но мне трудно найти, как это работает.Parse Specific Elements DOM - Java

Это файл XML (от www.w3schools.com):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<bookstore> 
    <book category="cooking"> 
     <title lang="en">Everyday Italian</title> 
     <author>Giada De Laurentiis</author> 
     <year>2005</year> 
     <price>30.00</price> 
    </book> 
    <book category="children"> 
     <title lang="en">Harry Potter</title> 
     <author>J K. Rowling</author> 
     <year>2005</year> 
     <price>29.99</price> 
    </book> 
    <book category="web"> 
     <title lang="en">XQuery Kick Start</title> 
     <author>James McGovern</author> 
     <author>Per Bothner</author> 
     <author>Kurt Cagle</author> 
     <author>James Linn</author> 
     <author>Vaidyanathan Nagarajan</author> 
     <year>2003</year> 
     <price>49.99</price> 
    </book> 
    <book category="web" cover="paperback"> 
     <title lang="en">Learning XML</title> 
     <author>Erik T. Ray</author> 
     <year>2003</year> 
     <price>39.95</price> 
    </book> 
</bookstore> 

Как вы можете увидеть книги XQuery Кик Start имеет более одного автора. Но я не могу найти способ получить нужное количество авторов. Thats мой код:

public static void main(String argv[]) throws ParserConfigurationException, SAXException, IOException { 

    File fXmlFile = new File("\books.xml");   
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(fXmlFile); 

    doc.getDocumentElement().normalize(); 

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

    NodeList nList = doc.getElementsByTagName("book"); 

    System.out.println("----------------------------"); 

    for (int temp = 0; temp < nList.getLength(); temp++) { 

     Node nNode = nList.item(temp); 

     System.out.println("\nCurrent Element :" + nNode.getNodeName()); 

     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element eElement = (Element) nNode; 

      System.out.println("Category : " + eElement.getAttribute("category")); 
      System.out.println("Title : " + eElement.getElementsByTagName("title").item(0).getTextContent()); 
      System.out.println("Author : " + eElement.getElementsByTagName("author").item(0).getTextContent()); 
      System.out.println("Year : " + eElement.getElementsByTagName("year").item(0).getTextContent()); 
      System.out.println("Price : " + eElement.getElementsByTagName("price").item(0).getTextContent()); 
     } 
    } 

Но, как результат я буду получать только один автор:

Root element :bookstore 
---------------------------- 

Current Element :book 
Categoria do Livro : cooking 
Titulo : Everyday Italian 
Autor : Giada De Laurentiis 
Ano : 2005 
Price : 30.00 

Current Element :book 
Categoria do Livro : children 
Titulo : Harry Potter 
Autor : J K. Rowling 
Ano : 2005 
Price : 29.99 

Current Element :book 
Categoria do Livro : web 
Titulo : XQuery Kick Start 
Autor : James McGovern 
Ano : 2003 
Price : 49.99 

Current Element :book 
Categoria do Livro : web 
Titulo : Learning XML 
Autor : Erik T. Ray 
Ano : 2003 
Price : 39.95 

Кто-нибудь знает хороший метод, чтобы получить нужное количество элементов? жаль длинный вопрос, я не знаю, как выразить себя, так что я должен был вставить здесь * Я новичок в DOM *

+0

Вы должны были бы итерацией над 'NodeList' возвращаемого' getElementsByTagName («автор») ' вместо gettin g '.item (0)'. –

+0

Выньте .item (0), поскольку он ограничивает вас только первым в списке – DiMono

ответ

0

Вы получаете первый автор всегда, так как вы извлечения первый пункт нодлиста

getElementsByTagName("author").item(0) 

Постарайтесь перебор их, так как там может быть более чем один

for (int i = 0; i < eElement.getElementsByTagName("author").getLength(); i++) 
    System.out.println("Author : " + 
      eElement.getElementsByTagName("author").item(i).getTextContent());