解析xml文件中引用xml文件的实体(android)
我正在使用XML文件将一些数据传递到我的Android应用程序,但随着它们变大,变得越来越难以避免丢失,所以我想分割一些部分把它变成更小的文件。也就是说,在第一地方,我有这样的事情:解析xml文件中引用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:
- 设置功能XmlPullParser.FEATURE_PROCESS_DOCDECL,并让解析器过程中的DTD本身。然后,它应该读取所谓的“替换文本”而不是&。实体。
- 取消设置,并使用defineEntityReplacementText(String,String)方法自己处理DTD,该方法在实体名称和替换文本之间创建映射。
令我困扰的是唯一的替代品可能是...文本。那么我是否应该用它所指的另一个XML文件的全部内容替换每个实体?但是,然后解析器不会将它看作是要解析的文件,而只是一个给定元素的超长值。
无论如何,选项1)只是没有为我工作,就好像DTD是在文件本身定义的(例如像在guests.xml中)我得到一个异常如果我不使用关键字像“公共”或“系统”。如果我确实使用“SYSTEM”,则给定实体的替换文本仅为空。如果DTD在file.dtd中定义,则所有替换文本都只是空字符串。
我没有勇气尝试选项2.因为我觉得一旦我在“defineEntityReplacementText”地图中填充了所有需要的条目,我最终会遇到同样的问题。
是否有人看到任何推理错误或解决方法,不涉及创建我自己的 alice.xml 元素并自行解析它?
非常感谢
好了,所以我最终没有是添加属性“文件”来引用外部XML文件中的节点,加载它们,并添加一些代码来代替节点。
guests.xml:
<? ... ?>
<guests>
<guest file="alice.xml"/>
<guest file="bob.xml"/>
</guests>