从 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哈哈哈哈哈哈!
我计划将一些 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哈哈哈哈哈哈!