2012-01-23 2 views
0

그래서, nodelist 및 documentbuilder를 사용하여 Android 앱에서 XML 파일을 구문 분석하려고합니다. 문제는 Documentbuilder.parse()는 항상 null을 반환하고 IOException을 던집니다. 파일 경로가 잘못되어있는 것과 관련이 있다고 생각합니다.Android XML 구문 분석, Documentbuilder가 예외를 throw합니다

public class EquiScoreActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ProtocolFactory.GetProtocolFactory().LoadProtocol("EquiScore/assets/Protocols/LC1_2008.xml"); 
    } 
} 

public class ProtocolFactory 
{ 
    private static ProtocolFactory m_Instance = new ProtocolFactory(); 
    Document dom; 

    private ProtocolFactory() 
    { 
    } 

    public static ProtocolFactory GetProtocolFactory() 
    { 
     return m_Instance; 
    } 

    public Protocol LoadProtocol(String filename) 
    { 
     Protocol output = null; 
     List<JudgementGroup> jGroups; 
     List<GeneralAssesment> gAssesment; 

     ParseXmlFile(filename); 
     ParseDocument(); 

     return output; 
    } 


    private void ParseXmlFile(String filename) 
    { 
     //get the factory 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

     try 
     { 
      //Using factory get an instance of document builder 
      DocumentBuilder db = dbf.newDocumentBuilder(); 

      //parse using builder to get DOM representation of the XML file 
      dom = db.parse(filename); 
     } 
     catch(ParserConfigurationException pce) 
     { 
      pce.printStackTrace(); 
     } 
     catch(SAXException se) 
     { 
      se.printStackTrace(); 
     } 
     catch(IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 

} 

기본적으로 적절한 파일 경로 또는 XML을 구문 분석하는 다른 방법을 알아야합니다. 하나의 유형의 각 노드는 서로 다른 수의 자식 노드를 가질 수 있습니다. 따라서이 방법이 좋은 방법이라고 생각했습니다.

IOException이는 다음과 같습니다 "MalformedURLException가" "프로토콜이 찾을 수 없습니다 EquiScore/자산/프로토콜/LC1_2008.xml"

나는 파일 이름의 다양한 변화를 시도했지만 어쨌든이 오류가 보인다했습니다.

답변

2

IOException은 전달하는 항목이 맨손 경로 이름이고 DocumentBuilder.parse()은 URL이 필요하기 때문입니다.

URL의 첫 번째 부분을 "프로토콜"이라고합니다 (에 http입니다). 경로 이름이 프로토콜을 지정하지 않으므로 "프로토콜을 찾을 수 없습니다"라는 오류가 표시됩니다. file://을 미리 추가하여 경로 이름에서 URL을 만들 수 있습니다.

또는 File 또는 FileInputStream 개체를 만들고 메서드가 오버로드되어 있으므로 DocumentBuilder.parse()으로 전달할 수 있습니다.

dom = db.parse(new File(filename)); 

편집 :

AssetManager assetManager = ... 
dom = db.parse(assetManager.open("Protocols/LC1_2008.xml")); 
+0

감사합니다, "파일을 찾을 수 없습니다"오류로 저를 가지고 적어도 그! :) 이제 내 파일 경로를 알아 내야합니다. 자산/프로토콜 /에 있지만 작동하지 않는 것 같습니다. – Bentebent

+0

음, 자산 (assets/폴더의 내용)은 파일이나 URL이 아닌 AssetManager API를 통해 액세스합니다. – Jens

+0

좋아요, 그래서 최선의 행동 방침은 무엇입니까? res/XML/Protocols와 같은 새로운 폴더를 만들고 거기에서 가져 오겠습니까? 편집 : 음, 나는 이것을 시도하고 있지만 어쨌든 파일을 찾을 수 없습니다. 나는 파일 경로 또는 모든 것에 대해 잘못된 길을 생각하고 있어야만 하는가? – Bentebent

1

: 파일이 assets/ 폴더에 있기 때문에 당신이 DocumentBuilder.parse()의 오버로드 된 버전 중 하나에 의해 허용 차례에 InputStream을 반환 AssetManager.open()를 사용할 수있는이 같은 예를 들어 분명히 XML을 assets 폴더에 넣었으므로 을 사용하여 구문 분석 할 InputStream을 검색해야합니다. 이 같은

뭔가 :

Context context = ...; 
AssetManager assManager = context.getAssets(); 
DocumentBuilder db = ..; 
db.parse(assManager.open("Protocols/LC1_2008.xml")); 
+0

+1 AssetManager –

+0

환상적! 도움을 주셔서 감사합니다, 이것이 문제를 해결 한 것 같습니다! – Bentebent