2016-03-23 15 views
0

Ich plane einige XML-Dateien in meinem Res/XML-Verzeichnis, die ich in Document-Objekte laden möchte (wie ich diese gerade in meiner Anwendung verwende und bin) sie viel herumreichen).Hol dir org.w3c.dom.Document von XMLResourceParser

tun:

XMLResourceParser parser = getResources().getXml(R.xml.my_xml_file) 

scheint den einzigen Ausgangspunkt zu sein und die XMLResourceParser implementiert XmlPullParser, die bei Iterieren durch den Baum von Knoten gerichtet zu sein scheint.

Ich habe versucht, XPath mit dem Wurzelknoten des Dokuments zu ziehen, gemäß dem Code in dieser Antwort: navigate through XML document with XMLpullParser, aber das gibt mir eine Ausnahme gemäß dieser Frage: Evaluating XPath an XmlResourceParser causes Exception

Idealerweise brauche ich um das XML im Ordner res/xml zu behalten, da ich den Inhalt lokalisieren möchte, ist es keine Option, es in res/rohe oder res/assets zu verschieben.

Bevor ich etwas implementiere, das durch den XmlResourceParser iteriert und das Dokument erstellt, gibt es einen einfacheren Weg, dies zu tun?

Antwort

1

Schreiben Sie den Code, um durch die XMLResourceParser zu iterieren, zeigt, dass Sie ein netter, gut erzogener Entwickler sind.

Sie könnten jedoch versucht sein, die bösen Genie Option zu verwenden.

Zuerst erstellen Sie eine XmlPullParser Implementierung, die eine XmlResourceParser im Konstruktor übernimmt, umschließt und alle Methoden an ihn delegiert - mit Ausnahme aller Methoden des Typs setInput. Sie wollen, dass alle diese nicht-op-Stubs sind, weil XmlResourceParser Ausnahmen auslösen wird (siehe XmlBlock.java, Zeile 108 oder so). Android Studio kann das Erstellen der Delegiertenmethoden automatisieren, sodass Sie all das nicht manuell programmieren müssen.

PullParserWrapper wrapper = new PullParserWrapper(
      getResources().getXml(R.xml.my_xml_file)); 

Hinweis: Ihre Wrapper-Klasse könnte müssen einige Verfahren Implementierungen zu handhaben Namespace Verarbeitung und verschiedene andere Dinge ausschalten.

Als nächstes werden Sie einen org.xmlpull.v1.sax2.Driver verwenden Ihre Parser zu wickeln und wandeln es in ein XMLReader:

XMLReader xmlReader = new Driver(wrapper); 

Jetzt eine Dummy-Eingangsquelle einrichten (die XmlResourceParser bereits weiß, wo es seine Eingabe bekommen):

InputSource inputSource = new InputSource(new StringReader("")); 

Dann nutzen Sie eine Transformer Ihre SAX Eingabe in einen DOM-Ausgang zu konvertieren und Ihr Ergebnis:

 Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     DOMResult domResult = new DOMResult(); 
     transformer.transform(new SAXSource(xmlReader, inputSource), domResult); 
     Document document = (Document) domResult.getNode(); 

MWAH Ha Ha Ha Ha Ha Ha!

+0

Wow! Daran hatte ich nicht gedacht! Ich gebe das später eine Bash, dann akzeptiere! – GHC

+0

Willkommen im Evil Genius Club. –