解析在xml文件中引用xml文件的实体(android)

时间:2014-05-08 15:51:07

标签: java android xml xmlpullparser domparser

我正在使用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的模式:

  1. 设置功能XmlPullParser.FEATURE_PROCESS_DOCDECL,让解析器处理DTD本身。然后,它应该读取所​​谓的“替换文本”而不​​是&amp; ..;实体。
  2. 取消设置,并使用方法defineEntityReplacementText(String,String)自行处理DTD,该方法在实体名称及其替换文本之间创建映射。
  3. 困扰我的是,唯一可能的替代品是......文字。我应该用它所指的其他XML文件的全部内容替换每个实体吗?但是然后解析器不会将其视为要解析的文件,而只是一个给定元素的超长值。

    无论如何,选项1.)只是对我不起作用,好像DTD是在文件本身中定义的(例如在guests.xml中),如果我不使用像“公共“或”系统“。如果我使用“SYSTEM”,则给定实体的替换文本只是null。如果在文件.dtd中定义了DTD,则所有替换文本都只是空字符串。

    我没有勇气尝试选项2.因为我感觉一旦我在“defineEntityReplacementText”地图中填写了所有需要的条目,我最终会遇到同样的问题。

    是否有人看到任何推理错误,或者不涉及创建我自己的解决方法     alice.xml 元素并由我自己解析?

    非常感谢

1 个答案:

答案 0 :(得分:1)

好的,我最终做的是向引用外部XML文件的节点添加属性“file”,加载它们,并添加一些代码来替换节点。

guests.xml:

<? ... ?>
<guests>
    <guest file="alice.xml"/>
    <guest file="bob.xml"/>
</guests>