从 XMLResourceParser 获取 org.w3c.dom.Document

Get org.w3c.dom.Document from XMLResourceParser

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

正在做:

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

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

我试过使用 xpath 提取文档的根节点,按照这个答案中的代码:navigate through XML document with XMLpullParser, but this gives me an exception as per this question:

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

在我实现遍历 XmlResourceParser 并构建文档之前,是否有更简单的方法来执行此操作?

编写代码以遍历 XMLResourceParser 表明您是一位彬彬有礼的开发人员。

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

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

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

注意:您的包装器 class 可能需要一些方法实现来处理关闭命名空间处理和其他各种事情。

接下来,您将使用 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哈哈哈哈哈哈!