2012-01-23 3 views
0

Итак, я пытаюсь разобрать XML-файл в своем приложении для Android, используя нодэлист и Documentbuilder. Проблема в том, что Documentbuilder.parse() всегда возвращает null и заканчивает тем, что бросает исключение IOException. Я предполагаю, что это имеет какое-то отношение к неправильному пути к файлу.Анализ XML XML, Documentbuilder throws exception

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 в http://www.google.com). Ваше имя пути не указывает протокол, и, следовательно, ошибка читает «Протокол не найден». Вы можете сделать URL-адрес из имени пути, добавив к нему file://.

В качестве альтернативы вы можете создать объект или FileInputStream и передать его DocumentBuilder.parse(), так как метод перегружен. Например, как это:

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

EDIT: Так как файл находится в папке assets/ вы можете использовать AssetManager.open(), который возвращает InputStream, который, в свою очередь, принятого одной из перегруженных версий DocumentBuilder.parse():

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

Спасибо, что у меня в «Файл не найден», по крайней мере! :) Теперь мне просто нужно выяснить путь к файлу. Он находится в активах/протоколах /, но это, похоже, не работает. – Bentebent

+0

Ну, активы (материал в активах/папке) доступны через API AssetManager - не файл или URL-адреса. – Jens

+0

Хорошо, так какой был бы лучший способ действий? Создайте новую папку, что-то вроде res/XML/Protocols и получите ее оттуда? Редактировать: Ну, я пробую это, но не могу найти его, чтобы найти файлы в любом случае. Должно быть, я не ошибаюсь в отношении файлового пути или всего этого? – Bentebent

1

Очевидно, вы поместили XML в папку с ресурсами, поэтому вы должны использовать AssetManager для извлечения InputStream для синтаксического анализа.

Что-то вроде этого:

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

+1 для AssetManager –

+0

Фантастический! Спасибо за помощь, это, похоже, решило проблему! – Bentebent

Смежные вопросы