从XMLResourceParser获取org.w3c.dom.Document

时间:2016-03-23 11:19:12

标签: java android xml domdocument xmlpullparser

我计划在我的res / xml目录中放入一些XML文件,我想将其加载到Document对象中(因为我现在在我的应用程序中使用这些文件并且正在传递它们)

这样做的:

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

似乎是唯一的起点,XMLResourceParser实现了XmlPullParser,它似乎旨在迭代遍历节点树。

我已经尝试使用xpath来提取文档的根节点,根据此答案中的代码:navigate through XML document with XMLpullParser,但是根据这个问题,这给了我一个例外:{{3} }

理想情况下,我需要将xml保留在res / xml文件夹中,因为我想要本地化内容,因此将其移动到res / raw或res / assets不是一个选项。 / p>

在我实现迭代XmlResourceParser并构建Document之前,有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:1)

编写代码来迭代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哈哈哈哈哈哈!