2013-03-14 8 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> 

CODE (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을 시도

@ 발견 한 일반적인 해결책이있다, 그것은 잘 작동; Sysout 대신 POJO를 채우기 만하면됩니다. 당신이 필요로하는

방법은 내가 코드를 조금 수정 귀하의 요청에 따라 그냥 바로 자식 노드가 아닌 서브 아이를 원하는

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()); 
     } 
    } 

여기에 내가 Assets folderXML 파일을 넣어하지만 당신은 인터넷에서 액세스하기를 원한다면, 당신은 할 수 있습니다.

로그인

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 내 대답을 편집했습니다. 확인하십시오. –