2011-02-04 3 views
4

현재 Android 앱을 사용하고 있으며 Java 학습 방법을 배우고 있습니다. 몇 년 동안 Python을 가지고 놀았지만 안드로이드 폰이 생겼다. 이 앱은 기본적으로 XML 파일에 저장된 비디오 게임 목록을 로컬에 표시합니다. 지금 XML 파일의 구조는 기본적으로 게임> 게임 (다중)> 이름 (더 이상 중요하지 않은 다른 것들)입니다. 나는 현재 게임의 이름 목록을 얻으려고하고있다. 나는 자습서와 정보를 찾았지만 아무 것도 필요로하지 않는 것 같다. 실제로 작동하는 방법을 이해하고 싶습니다. 복사/붙여 넣기가 가능한 코드 조각을 가지고있는 것이 아닙니다. 또한 이름 목록은 Android에서 사용할 문자열 배열로 끝나야합니다. 여기에 제가 지금 가지고있는 함수가 있습니다. (자습서에서 복사/붙여 넣기를 많이 했으므로 읽을 수는 없습니다. 실제로 작동하면 문제를 해결할 것입니다.) 지금은 listview가 비어있는 것으로 나타납니다. 적어도 그 이전보다 더 나은 그것은 당신이 gameList에 fstNmElmnt.toString()를 추가 점에서, 당신의 코드에서 ... 더 이상하지만Java에서 XML 파일 구문 분석을 사용하여 이름 목록을 얻으십시오.

public static String[] parse(String filename) { 
     ArrayList<String> gamesList = new ArrayList<String>(); 

     try { 
     File file = new File(filename); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(file); 
     doc.getDocumentElement().normalize(); 
     NodeList nodeList = doc.getElementsByTagName("game"); 

     for (int s = 0; s < nodeList.getLength(); s++) { 

     Node fstNode = nodeList.item(s); 

     //if (fstNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element name = (Element) fstNode; 
       Element fstElmnt = (Element) fstNode; 
      NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("name"); 
      Element fstNmElmnt = (Element) fstNmElmntLst.item(0); 
      NodeList fstNm = fstNmElmnt.getChildNodes(); 

      gamesList.add(fstNmElmnt.toString()); 
     //} 

     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    String[] gamesArray; 
    gamesArray = (String[]) gamesList.toArray(new String[0]); 
    return gamesArray; 
    } 
+2

Java에 익숙하지 않다면 XML 파일을 구문 분석하는 것으로 시작하는 것이 좋습니다. DOM 호출의 일반적인 형식은 괜찮아 보입니다. 'NodeList nodeList'로 무엇을하고 있습니까? 프로그램이 FOR 루프에 들어가 있습니까? – user183037

+0

학습 과제가 아니라면 저수준 DOM 인터페이스를 사용하여 하나의 XPath 표현식으로 쉽게 달성 할 수있는 일을하고 싶지 않을 것입니다. (하위 레벨 트리 탐색을 사용하려는 경우에도 DOM은 가능한 최악의 선택입니다. 즉, JDOM과 XOM은 사용하기가 훨씬 빠르며 빠릅니다.) –

+0

실제로 Android에는 XPath가 없습니다. 그래서 저수준 것들을해야합니다. –

답변

1

충돌하지 않고,이 태그에 해당하는 요소는 게임의 당신의 XML이 < 이름을 구성된다고 가정> 조 </이름>, 다음 (요소 자체에 대한() 대신에 toString을 호출하는) 첫 번째 자식의 값을 얻을 필요가 : 그런데

gamesList.add(fstNmElmnt.getFirstChild().getNodeValue()); 

,

NodeList nodeList = doc.getElementsByTagName("name"); 
for (int s = 0; s < nodeList.getLength(); ++s) { 
    gamesList.add(nodeList.item(s).getFirstChild().getNodeValue()); 
} 
0

Simple을 사용해보십시오 : 당신이 문서의 다른 부분에서 < 이름> 태그, 또는이 단계에서 다른 처리를 위해 < 게임> 요소를 필요로하지 않는 한, 다음 (훨씬 더 간단) 코드를 사용할 수 있습니다 :)

0

Robert Massaioli's answer은 Simple 사용에 대한 통찰력을 제공합니다.

기억해야 할 중요한 점은 Simple XML은 클래스를 사용하여 논리적으로 생성 할 수있는 구조를 따라야한다는 것입니다. 따라서 오류 인터페이스를 사용하는 BaseClass를 만들고 데코레이터 패턴을 적용하여 구현 된 객체가 없어도 구체적인 오류 클래스로 전달할 수 있습니다.

그건 아마 말이되지 않습니다. 어떻게 알았지 ... 난 그냥 멀리 가서 내가 생각을 정확하게 구현하고 여기에 있습니다 ...을 보여 대해 결과 (전체 코드 링크) :

메인 파일 :

패키지 닷컴. massaiolir.simple.iface;

import java.io.File;

import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister;

공용 클래스 메인 { public static void main (String [] args) 예외 { Serializer serial = new Persister(); ResC resc = serial.read (ResC.class, 새 파일 ("data/testdata.xml"));

System.out.println(" == Printing out all of the error text. == "); 
    System.out.println(resc.getErrorText()); 
    System.out.println(resc.conRes.getErrorText()); 
    System.out.println(resc.conRes.conList.getErrorText()); 
    for (Con con : resc.conRes.conList.cons) { 
     System.out.println(con.getErrorText()); 
    } 
    System.out.println(" == Finished printing out all of the error text. == "); 
} 

} 그냥 간단하게 실행하고 결과를 표시합니다.

BaseObject.자바 클래스 :

패키지 com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

public class BaseObject implements Error { @Element (name = "Err", 필수 = false, type = ConcreteError.class) 개인 오류 err;

@Override 
public String getErrorText() { 
    return err.getErrorText(); 
} 

@Override 
public void setErrorText(String errorText) { 
    err.setErrorText(errorText); 
} 

} 이 모든 것이이 '잘못'하고자하는 경우 확장해야하는 클래스입니다.

오류 인터페이스 :

패키지 com.massaiolir.simple.iface;

공용 인터페이스 오류 { void setErrorText (String errorText);

String getErrorText(); 

} ConcreteError 클래스 :

패키지 com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

public class ConcreteError implements 오류 { @Attribute 개인 문자열 텍스트;

@Override 
public String getErrorText() { 
    return text; 
} 

@Override 
public void setErrorText(String errorText) { 
    this.text = errorText; 
} 

} 실제 구현 클래스는이 시점 이후입니다. 위의 클래스에서 실제 작업이 처리되기 때문에 이러한 작업은 사소한 작업이라는 것을 알 수 있습니다.

사기꾼 클래스 :

패키지 com.massaiolir.simple.iface;

공용 클래스 콘은 BaseObject {

} ConList 클래스 확장 :

패키지 com.massaiolir.simple.iface을;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

public class ConList extends BaseObject { @ElementList (항목 = "Con", 인라인 = true) public ArrayList cons; } ConRes 클래스 :

패키지 com.massaiolir.simple.iface;

import org.simpleframework.xml.요소;

공용 클래스 ConRes는 BaseObject { @Element (name = "ConList")를 확장합니다. public ConList conList; } ResC 클래스 :

패키지 com.massaiolir.simple.iface;

import org.simpleframework.xml.Element; import org.simpleframework.xml.Root;

@root Public 클래스 ResC는 BaseObject을 { @Element (이름 = "ConRes") 공개 ConRes conRes의 연장; } 그게 전부입니다. 아주 단순한 권리. 나는 그 모든 것을 10 분 만에 쾅 할 수 있었다. 실제로이 응답을 작성하는 데 걸리는 시간이 필자에게주는 코드를 작성하는 데 걸리는 시간보다 길었습니다. 내가 작성한 코드에 대해 이해하지 못한다면 알려주십시오. 이렇게하면 이런 일을 어떻게 할 것인지 이해하는 데 도움이되기를 바랍니다.

관련 문제