2013-05-10 2 views
3

간단한 Java 게임을 프로그래밍 중이며 플레이어 데이터에 XML로 인코딩 된 저장 파일을 저장하려고했습니다. 현재 Java XML DOM API를 발견하고 있으며 짧은 질문이 있습니다.Java XML : 중첩 요소 가져 오기

가정하자 나는 다음과 같은 XML 파일이 (내가 아는 이해가되지 않습니다,하지만 그냥 예입니다)

<?xml version="1.0"?> 
<savedGame> 
    <name></name> 
    <player> 
     <name>YOU</name> 
     <map> 
         <health>2000</health> 
      <name>map_test.map</name> 
      <position> 
       <x>0</x> 
       <y>0</y> 
      </position> 
     </map> 
     <stats> 
      <health>1000</health> 
      <xp> 
       <melee></melee> 
       <magic></magic> 
       <ranged></ranged> 
       <agility></agility> 
      </xp> 
     </stats> 
     <items> 
      <item id="0"> 
       <amount></amount> 
      </item> 
     </items> 
    </player> 
</savedGame> 

가 지금은 선수의 건강 수준 (타 있음을 유의을 얻으려면 지도 섹션의 상태 요소). 다음 코드를 사용하여이 작업을 수행 할 수 있습니다.

String hp = ((Element) ((Element) savedGameDocument.getElementsByTagName("player").item(0)).getElementsByTagName("stats").item(0)).getElementsByTagName("health").item(0).getTextContent() 

작동합니다. 그러나 그것은 나에게 매우 불쾌 해 보인다. 이러한 중첩 요소를 가져 오는 일반적인 방법입니까? ElementList 클래스가없는 이유는 무엇입니까? 이제 모든 노드를 캐스팅해야합니다.

미리 감사드립니다. Jori.

+1

에서 데이터를 액세스하는 작업. 이 도구를 사용하면 yourjava 객체 모델을 사용하여 작업하고 XML에 직렬화를 이어받습니다. – nakosspy

+0

글쎄 고마워, 나는 그것을 볼 것이다. 하지만 이것이 정상적인 자바 XML API로 할 수있는 최선의 방법이라면 나는 너무 행복하다. – Jori

+0

JAXB (JSR-222)는 JDK/JRE에 포함 된 일반적인 Java XML API의 일부입니다 ('javax.xml.bind' 패키지 참조). –

답변

1

이 작업을 많이 수행하면 simple serializer을 처리 할 수 ​​있습니다. 당신은 객체를 쓰고 객체 (예 : 플레이어 등)를 읽습니다. 직렬자는 XML 부분을 처리합니다. 게임 개발에 집중하는 동안.

DOM에서 XML을 수동으로 구문 분석 할 때 이미 사용중인 로직을 더 이상 작게 만들 수 없습니다. DOM은 매우 기본적인 탐색 방법을 제공하기 때문에 하위 노드를 나열하고 그 중 하나를 선택하고 필요한 노드에 도달 할 때까지 반복합니다. 이것은 경량 XML에 좋을 수도 있지만, 많은 태그 레벨을 가진 복잡한 구조를 구문 분석 할 때 곧 악몽으로 변하게됩니다.

또 다른 빠른 방법은 streaming이지만 여전히 복잡한 XML 구조가 생성되므로 파서 코드도 마찬가지입니다.

XPATH 또한 특정 노드에 대해서만 XML을 쿼리하면됩니다. 그러나 객체 변환에 대해 전체 XML을 필요로하는 경우 직렬기를 사용하십시오.

+0

매우 흥미 롭습니다. 특히 많은 게임 데이터를 저장할 때 매우 유용 할 수 있습니다. 그러나 또한, 나의 원래 질문을 참조하십시오. :-) – Jori

+0

JDK/JRE의'javax.xml.xpath' API를 사용하면 DOM에서 데이터에 쉽게 액세스 할 수 있습니다. http://stackoverflow.com/a/16480432/383861 –

+0

마지막 두 가지 질문 : where can can 제공된 문서 (http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize)에서 사용 된 주석을 찾으십니까? 이진 직렬화 대 XML 직렬화, 언제 사용해야합니까? 미리 감사드립니다. – Jori

3

JDK/JRE에 포함 된 javax.xml.xpath API를 사용하여 do 문서에서 데이터를 쉽게 얻을 수 있습니다.

import javax.xml.xpath.*; 
import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 

     InputSource xml = new InputSource("src/forum16479976/input.xml"); 
     String health = (String) xpath.evaluate("/savedGame/player/stats/health", xml, XPathConstants.STRING); 
     System.out.println(health); 
    } 

} 

이 API는 JAXB에서보기는 DOM

import javax.xml.parsers.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.Document; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document xml = db.parse("src/forum16479976/input.xml"); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     String health = (String) xpath.evaluate("/savedGame/player/stats/health", xml, XPathConstants.STRING); 
     System.out.println(health); 
    } 

}