본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] DOM Parser ( 돔 파서 )

by 돼지왕 왕돼지 2012. 2. 18.
반응형


안녕하세요 돼지왕 왕돼지입니다.
오늘은 DOM Parser ( 돔 파서 ) 에 대해 간단히 알아보죠.


DOM 파서는 또 뭐고?

 
  : xml 문서의 모든 내용을 메모리에 트리 형태로 펼친 후 읽는 파서이기 때문에 특정 태그 재접속 속도가 대단히 빠르고, 임의의 노드를 여러번 읽을 수 있습니다. 하지만, 전체 문서를 다 읽어서 트리를 완성한 후에야 읽기가 가능하므로, 처음 시작이 다소 느리다는 단점이 있고, 문서가 커지면 메모리를 많이 소비하는 것도 문제입니다. XML의 편집도 가능하다는 장점도 가지고 있네요.




예제 소스나 줘봐요.

 
 <example 1>

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
               "<order><item>Mouse</item></order>";
 
try{
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   InputStream istream = new ByteArrayInputStream(xml.getBytes("utf-8"));
   Document doc = builder.parse(istream);
 
   Element order = doc.getDocumentElement();
   NodeList items = order.getElementsByTagName("item");
   Node item = items.item(0);
   Node text = item.getFirstChild();
   String ItemName = text.getNodeValue();
}
catch (Exception e){ ; }

  




static DocumentBuilderFactory DocumentBuilderFactory.newInstance ()
DocumentBuilder DocumentBuilderFactory.newDocumentBuilder()
 
Document DocumentBuilder.parse (InputStream stream [, String systemId])
Document DocumentBuilder.parse (String uri)
Document DocumentBuilder.parse (File file)
  -> XML 전체를 받아오는 것.
 
 
Element Document.getDocumentElement ()
  -> XML 문서는 유일한 루트 엘리먼트를 가진다.
       이 메서드가 루트 앨리먼트를 구한다. 루트를 구해야 자식들을 읽을 수 있다.
  
NodeList Element.getElementsByTagName (String tagname)
  -> 루트 밑에 tagname을 가진 sub-parent를 구한다.
 
String getNodeName ()
short getNodeType ()
String getNodeValue ()
 
Node getFirstChild()
Node getLastChild()
Node getNextSibling ()
Node getPreviousSibling ()
Node getParentNode ()
NodeList getChildNodes ()
    -> DOM은 엘리먼트 안의 문자열도 하나의 객체로 취급하기 때문에
       태그 안의 문자열을 읽으려면 getFirstChild -> getNodeValue로 값을 읽어야 한다.
 
NamedNodeMap Node.getAttributes ()
   -> 엘리먼트의 속성을 읽을 때, attribute 하나하나도 다 node로 매핑
 
 



<example 2>

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
               "<order>" +
               "<item Maker=\"Samsung\" Price=\"23000\">Mouse</item>"+
               "<item Maker=\"LG\" Price=\"12000\">KeyBoard</item>" +
               "<item Price\"156000\" Maker=\"Western Digital\">HDD</item"+"</order>";
 
try{
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   InputStream istream = new ByteArrayInputStream(xml.getBytes("utf-8"));
   Document doc = builder.parse(istream);
 
   Element order = doc.getDocumentElement();
   NodeList items = order.getElementsByTagName("item");
   String result = "";
   for (int i = 0; i < items.getLength; i++){
      Node item = items.item(i);
      Node text = item.getFirstChild();
      String ItemName = text.getNodeValue();
      Result += ItemName + " : ";
 
      NamedNodeMap Attrs = item.getAttributes();
       for (int j = 0; j < Attrs.getLength(); j++){
          Node attr = Attrs.item(j);
          Result += (attr.getNodeName() + " = " + attr.getNodeValues() + " ");
       }
       Reulst += "\n";
   }
}
catch (Exception e){ ; }

 






반응형

댓글