我正在使用XML文件将一些数据传达到我的Android应用程序中,但随着它们变得越来越大,变得越来越难以迷失,因此我想将其中的一部分拆分为较小的文件。也就是说,首先我有类似的东西:
guests.xml
<? ... ?>
<guests>
<guest>
<person>
<name>Alice</name>
<vegetarian>no</vegetarian>
<drinks>everything</drinks>
</person>
</guest>
<guest>
<person>
<name>Bob</name>
<vegetarian>ofcourse</vegetarian>
<drinks>cocktails</drinks>
</person>
</guest>
</guests>
现在想要有类似的东西:
guests.xml
<? ... ?>
<!DOCTYPE guests [
<!ENTITY alice SYSTEM "alice.xml">
<!ENTITY bob SYSTEM "bob.xml">
]>
<guests>
<guest>&alice;</guest>
<guest>&bob;</guest>
</guests>
更加消化。当然,alice.xml会围绕这些行:
<? ... ?>
<person>
<name>Alice</name>
<vegetarian>no</vegetarian>
<drinks>everything</drinks>
</person>
所以我尝试使用不同的工具来提出类似的东西,不幸的是我没有设法接近目标。我的第一个失败是使用DOMParser。它使用“EntityResolver”,它是SAXParser工具定义的接口。你实现它,覆盖函数,然后你自己返回你希望解析继续工作的InputSource(如果我理解正确的话):
public class MyResolver implements EntityResolver {
public InputSource resolveEntity (String publicId, String systemId){
...
}
}
现在,它在常规Java环境中工作得很好,但在Android中,函数永远不会被调用(我怀疑那里存在一些问题)。所以我接着,尝试使用XmlPullParser(推荐的Android解析器)。我从来没有真正喜欢XmlPullParser(也许是因为我没有花时间去喜欢它)但是我让它工作,至少没有实体。不幸的是,似乎我错过了一件重要的事情,并且无法获得我想要的实体。如果我是正确的,有两种使用DTD的模式:
困扰我的是,唯一可能的替代品是......文字。我应该用它所指的其他XML文件的全部内容替换每个实体吗?但是然后解析器不会将其视为要解析的文件,而只是一个给定元素的超长值。
无论如何,选项1.)只是对我不起作用,好像DTD是在文件本身中定义的(例如在guests.xml中),如果我不使用像“公共“或”系统“。如果我使用“SYSTEM”,则给定实体的替换文本只是null。如果在文件.dtd中定义了DTD,则所有替换文本都只是空字符串。
我没有勇气尝试选项2.因为我感觉一旦我在“defineEntityReplacementText”地图中填写了所有需要的条目,我最终会遇到同样的问题。
是否有人看到任何推理错误,或者不涉及创建我自己的解决方法 alice.xml 元素并由我自己解析?
非常感谢
答案 0 :(得分:1)
好的,我最终做的是向引用外部XML文件的节点添加属性“file”,加载它们,并添加一些代码来替换节点。
guests.xml:
<? ... ?>
<guests>
<guest file="alice.xml"/>
<guest file="bob.xml"/>
</guests>