2013-03-14 6 views
0

файл XML выглядит следующим образом:Как перемещаться по узлам и получать их имена атрибутов? Я использую DomParser

<?xml version="1.0" encoding="utf-8"?> 
<parent> 
    <child ID="1" Name="CHILD" Order="1"> 
     <child ID="1" Name="SUB_CHILD" Order="1"> 
     </child> 
    </child> 
    <child ID="2" Name="CHILD2" Order="1"> 
     <child ID="1" Name="SUB_CHILD" Order="1"> 
     </child> 
    </child> 
</parent> 

КОД (NEW):

void listNodes(NodeList list) { 
    if (list.getLength() > 0) { 
     for (int i = 0; i < list.getLength(); i++) { 
      System.out.println("-------------------"); 
      if (list.item(i).hasAttributes()) { 
       NamedNodeMap attrs = list.item(i).getAttributes(); 
       for (int index = 0; index < attrs.getLength(); index++) { 
        Attr attribute = (Attr) attrs.item(index); 
        if(attribute.getName().equals("Name")){ 
        names[index] = ????        
         } 
       } 
      }else{ 
       System.out.println(list.item(i).getNodeName()+ " has no attributes"); 
      } 
      System.out.println("-------------------"); 
     } 
    } 
} 

Я отредактированный код. Теперь я знаю, что у attribute есть атрибуты. Как извлечь атрибут Name и поместить его в массив строк.

ответ

0

Существует один общее решение, которое я нашел @http://www.java2s.com/Code/JavaAPI/org.w3c.dom/NodegetAttributes.htm

Я попробовал ваш XML, а также, он отлично работает; просто заселите POJO вместо Sysout, и вам хорошо идти.

методы, которые вам нужны

static void listNodes(Node node, String indent) { 
    String nodeName = node.getNodeName(); 
    System.out.println(indent + " Node: " + nodeName); 
    short type = node.getNodeType(); 
    //System.out.println(indent + " Node Type: " + nodeType(type)); 
    if (type == TEXT_NODE) { 
     System.out.println(indent + " Content is: " 
       + ((Text) node).getWholeText()); 
    } else if (node.hasAttributes()) { 
     System.out.println(indent + " Element Attributes are:"); 
     NamedNodeMap attrs = node.getAttributes(); 
     for (int i = 0; i < attrs.getLength(); i++) { 
      Attr attribute = (Attr) attrs.item(i); 
      System.out.println(indent + " " + attribute.getName() + " = " 
        + attribute.getValue()); 
     } 
    } 

    NodeList list = node.getChildNodes(); 
    if (list.getLength() > 0) { 
     System.out 
       .println(indent + " Child Nodes of " + nodeName + " are:"); 
     for (int i = 0; i < list.getLength(); i++) { 
      listNodes(list.item(i), indent + " "); 
     } 
    } 
} 

static String nodeType(short type) { 
    switch (type) { 
    case ELEMENT_NODE: 
     return "Element"; 
    case DOCUMENT_TYPE_NODE: 
     return "Document type"; 
    case ENTITY_NODE: 
     return "Entity"; 
    case ENTITY_REFERENCE_NODE: 
     return "Entity reference"; 
    case NOTATION_NODE: 
     return "Notation"; 
    case TEXT_NODE: 
     return "Text"; 
    case COMMENT_NODE: 
     return "Comment"; 
    case CDATA_SECTION_NODE: 
     return "CDATA Section"; 
    case ATTRIBUTE_NODE: 
     return "Attribute"; 
    case PROCESSING_INSTRUCTION_NODE: 
     return "Attribute"; 
    } 
    return "Unidentified"; 
} 

Отредактировано

По вашему запросу я изменил код немного, как вы просто хотите непосредственные дочерние узлы, а не суб ребенка. здесь вы идете:

void listNodes(NodeList list) { 
    if (list.getLength() > 0) { 
     for (int i = 0; i < list.getLength(); i++) { 
      System.out.println("-------------------"); 
      if (list.item(i).hasAttributes()) { 
       NamedNodeMap attrs = list.item(i).getAttributes(); 
       for (int index = 0; index < attrs.getLength(); index++) { 
        Attr attribute = (Attr) attrs.item(index); 
        System.out.println(" " + attribute.getName() + " = "+ attribute.getValue()); 
       } 
      }else{ 
       System.out.println(list.item(i).getNodeName()+ " has no attributes"); 
      } 
      System.out.println("-------------------"); 
     } 
    } 
} 

Вызов этого метода listNodes(document.getDocumentElement().getChildNodes()); Он работает для меня.

+0

Прежде чем я увидел ваш ответ, я уже решил часть своей проблемы. Я предоставил код выше. Спасибо за ответ. Если бы ваш код мог исправить текущую проблему, я был бы очень рад ее использовать. – droidH

+0

с указанным выше кодом вы получаете все узлы и все связанные с ним элементы, вы можете изменить код для разрыва в том месте, где вы хотите. – Atrix1987

+0

Извините, но я не знаю, как это сделать сэр. Я почти на своем уме. – droidH

1

Код будет таким.

private void usingDOMParser() { 
     try { 
      DocumentBuilderFactory mDocumentBuilderFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder mDocumentBuilder = mDocumentBuilderFactory 
        .newDocumentBuilder(); 
      Document mDocument = mDocumentBuilder.parse(new InputSource(
        getAssets().open("example.xml"))); 
      mDocument.getDocumentElement().normalize(); 
      NodeList mNodeList = mDocument.getElementsByTagName("child"); 
      for (int i = 0; i < mNodeList.getLength(); i++) { 
       Node mNode = mNodeList.item(i); 
       Element mElement = (Element) mNode; 
       NodeList nameList = mElement.getElementsByTagName("child"); 
       Element nameElement = (Element) nameList.item(0); 
       nameList = nameElement.getChildNodes(); 
       Log.i("TAG", "ID: " + nameElement.getAttribute("ID")); 
       Log.i("TAG", "Name: " + nameElement.getAttribute("Name")); 
       Log.i("TAG", "Order: " + nameElement.getAttribute("Order")); 
      } 
     } 
     catch (Exception e) { 
      Log.e("TAG", "Exception: " + e.toString()); 
     } 
    } 

Здесь я положил файл XML в Assets folder, но если вы хотите получить к нему доступ из Интернета, вы можете сделать это.

Вход

03-14 17:58:15.845: I/AllTestActivity(624): ID: 1 
03-14 17:58:15.845: I/AllTestActivity(624): Name: CHILD 
03-14 17:58:15.845: I/AllTestActivity(624): Order: 1 
03-14 17:58:15.845: I/AllTestActivity(624): ID: 1 
03-14 17:58:15.845: I/AllTestActivity(624): Name: SUB_CHILD 
03-14 17:58:15.845: I/AllTestActivity(624): Order: 1 
03-14 17:58:15.845: I/AllTestActivity(624): ID: 1 
03-14 17:58:15.845: I/AllTestActivity(624): Name: SUB_CHILD_NODE1 
03-14 17:58:15.845: I/AllTestActivity(624): Order: 01 
03-14 17:58:15.845: I/AllTestActivity(624): ID: 2 
03-14 17:58:15.845: I/AllTestActivity(624): Name: SUB_CHILD_NODE2 
03-14 17:58:15.845: I/AllTestActivity(624): Order: 02 
03-14 17:58:15.854: I/AllTestActivity(624): ID: 2 
03-14 17:58:15.854: I/AllTestActivity(624): Name: CHILD2 
03-14 17:58:15.854: I/AllTestActivity(624): Order: 1 
03-14 17:58:15.854: I/AllTestActivity(624): ID: 1 
03-14 17:58:15.854: I/AllTestActivity(624): Name: SUB_CHILD 
03-14 17:58:15.854: I/AllTestActivity(624): Order: 1 
03-14 17:58:15.854: I/AllTestActivity(624): ID: 1 
03-14 17:58:15.854: I/AllTestActivity(624): Name: SUB_CHILD_NODE1 
03-14 17:58:15.854: I/AllTestActivity(624): Order: 01 
03-14 17:58:15.854: I/AllTestActivity(624): ID: 2 
03-14 17:58:15.854: I/AllTestActivity(624): Name: SUB_CHILD_NODE2 
03-14 17:58:15.854: I/AllTestActivity(624): Order: 02 

Импорт:

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

Я надеюсь, что это может помочь вам.

+0

TAG возврат исключается: java.lang.NullPointerException. Я делаю что-то неправильно? Каков ожидаемый результат этого? – droidH

+0

mNodeList.getLength() возвращает только 1 – droidH

+0

@droidH Я отредактировал мой ответ, пожалуйста, проверьте его. – 2013-03-14 12:26:40