2016-03-23 4 views
0

Я планирую разместить некоторые файлы XML в каталоге res/xml, который я хочу загрузить в объекты Document (поскольку я использую их в настоящее время в своем приложении и am их много пропускают).Получить org.w3c.dom.Document из XMLResourceParser

Выполнение:

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

, кажется, единственной отправной точкой и XMLResourceParser реализует XmlPullParser, который, кажется, направлены на переборе дерева узлов.

Я попытался с помощью XPath, чтобы вытащить корневой узел документа, в соответствии с кодом в этом ответе: navigate through XML document with XMLpullParser, но это дает мне исключение в соответствии с этим вопрос: Evaluating XPath an XmlResourceParser causes Exception

В идеале, мне нужно чтобы сохранить xml в папке res/xml, так как я хочу локализовать содержимое, поэтому переход к res/raw или res/assets не является вариантом.

Прежде чем я реализую что-то, что итерации через XmlResourceParser и строит документ, есть ли более простой способ сделать это?

ответ

1

Написание кода для итерации через XMLResourceParser показывает, что вы хороший воспитанный разработчик.

Однако у вас может возникнуть соблазн использовать опцию evil genius.

Сначала создайте реализацию XmlPullParser, которая принимает конструктор XmlResourceParser в конструкторе, обертывает его и делегирует ему все его методы - за исключением всех методов типа setInput. Вы хотите, чтобы все это были не-op-заглушки, потому что XmlResourceParser будет генерировать исключения (см. , строка 108 или около того). Студия Android может автоматизировать создание методов делегатов, поэтому вам не нужно вручную указывать все это.

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

Примечание: Ваш класс-оболочка может иметь несколько реализаций метода для обработки выключая обработки пространства имен и других различных вещей.

Далее вы будете использовать org.xmlpull.v1.sax2.Driver обернуть анализатор и превратить его в XMLReader:

XMLReader xmlReader = new Driver(wrapper); 

Теперь настроить источник фиктивного ввода (XmlResourceParser уже знает, где он получает свой вход):

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

Затем вы используете Transformer для преобразования ввода SAX к выходу DOM и получить результат:

 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! Я не думал об этом! Я дам это позже, а потом приму! – GHC

+0

Добро пожаловать в клуб Evil Genius. –