我打算将一些XML文件放在res / xml目录中,并希望将其加载到Document对象中(因为我目前正在应用程序中使用这些文件,并且将它们大量传递)。

正在做:

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迭代并生成Document的东西之前,是否有一种更简单的方法?

最佳答案

编写代码以遍历XMLResourceParser可以表明您是一个很好的人。

但是,您可能很想使用邪恶的天才选项。

首先,创建一个XmlPullParser实现,该实现在构造函数中使用XmlResourceParser,将其包装并将其所有方法委托给它-除了所有setInput类型的方法。您希望所有这些都是无操作存根,因为XmlResourceParser会引发异常(请参见XmlBlock.java,第108行左右)。 Android studio可以自动创建委托方法,因此您无需手动编写所有代码。

    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哈哈哈哈哈哈哈!

10-04 14:12