我计划在我的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之前,有没有更简单的方法呢?
答案 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哈哈哈哈哈哈!