2013-04-05 2 views
0

Я пытаюсь разобрать этот XML в Java:Разбор XML. Как я могу получить ребенка ребенка?

<entities> 
<entity name="product_section" id="1"> 
    <product_type>3</product_type> 
    <section_type>1</section_type> 
    <name>Empresa</name> 
    <description>d</description> 
    <position>1</position> 
    <align>left</align> 

    <files section_id="1"> 
     <ico id="ico_1" type="normal" src="sections/1/icons/ico.png"></ico> 
     <ico id="ico_2" type="hover" src="sections/1/icons/ico.png"></ico> 
     <ico id="ico_3" type="active" src="sections/1/icons/ico.png"></ico> 

     <img id="img_1" type="normal" src="sections/1/img/pestanya.png"></img> 
     <img id="img_2" type="hover" src="sections/1/img/pestanya-hover.png"></img> 
     <img id="img_3" type="active" src="sections/1/img/pestanya-active.png"></img> 

     <background id="background_1" type="background" position="1" src="sections/1/background/bg1.png"></background> 
     <background id="background_2" type="background" position="2" src="sections/1/background/bg2.png"></background> 
     <background id="background_3" type="background" position="3" src="sections/1/background/bg3.png"></background> 
    </files> 
</entity> 

Но я достиг Перебери лицо, получать все Субъект и каждый <product_type>, <section_type> и т.д. Но я хочу, чтобы петля через файлы тоже.

Это моя реализация до сих пор:

try { 
     File contingut = new File("xmlfile.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(contingut); 
     doc.getDocumentElement().normalize(); 
     System.out.println("root of xml file " + doc.getDocumentElement().getNodeName()); 
     //loop a cada entity 
     NodeList nodes = doc.getElementsByTagName("entity"); 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 
      Element element = (Element) node; 
      System.out.println("product_type: " + getValue("product_type", element)); 
      System.out.println("section_type: " + getValue("section_type", element)); 
      System.out.println("name: " + getValue("name", element)); 
      System.out.println("description: " + getValue("description", element)); 
      System.out.println("position: " + getValue("position", element)); 
      System.out.println("align: " + getValue("align", element)); 
     } 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 

getValue функция:

private static String getValue(String tag, Element element) { 
    NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes(); 
    Node node = (Node) nodes.item(0); 
    return node.getNodeValue(); 
} 

Я сделал много поиск Google, и все, что я нашел это "простые" примеры, с родитель и ребенок, но не ребенок ребенка.

Любая помощь будет оценена по достоинству.

+0

так что проблема? для тега файлов вам нужно написать еще одну функцию getValue. –

+1

Вы не используете андроид, но на странице разработки Android есть действительно опрятный пример того, как работает pullparser. Возможно, стоит проверить это, так как он работает одинаково в обычной java. Это здесь http://developer.android.com/training/basics/network-ops/xml.html – WereWolfBoy

ответ

1

В первом одном предложении:

проверки типа элемента после этого Element element = (Element) node;

использовать этот код или что-то вроде этого:

if (element.getNodeType() == Element.ELEMENT_NODE) { // do smth} 

и ответ на ваш вопрос:

Вы можете просто перепишите код. после создания element вы можете получить все его дочерние элементы с помощью element.getChildNodes();

он дает вам все дочерние теги. После этого вы пишете простой цикл, в котором вы получаете каждый элемент узла из списка узлов следующим образом:

NodeList nodes = element.getChildNodes(); 
for(int i =0; i < nodes.getLength(); i++){ 
    Element child = (Element) nodes.item(i); 
    if(child.getNodeType() == Element.ELEMENT_NODE){ 
      String tagName = child.getTagName(); 
      if(!tagName.equals("files")){ 
        System.out.println(tagName + " : " + child.getTextContent()); 
      }else{ 
        NodeList filesChilds = child.getChildNodes(); 
        for(int j = 0; j < filesChilds.getLength(); j++){ 
         //and like above 
        } 
      } 
    } 
}