Java 使用XMLpullParser浏览XML文档

Java 使用XMLpullParser浏览XML文档,java,android,Java,Android,我正在使用XmlPullParser从XML文档中提取数据。我的XML文档的结构如下: <creature id="1"> <name>CreatureName</name> <type>CreatureType</type> <size>CreatureSize</size> </creature> <creature id="2"> <name>CreatureName&l

我正在使用
XmlPullParser
XML文档中提取数据。我的XML文档的结构如下:

<creature id="1">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="2">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="3">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>

谢谢

XMLPullParser将始终根据当前的程序编码方式读取整个文档。如果您只想打印id为2的生物的详细信息,您应该确保在文本事件类型If语句中记录该生物的名称、种族和性别之前,encounterId==2

XMLPullParser无法知道文档中的某个地方有ID为2的内容,而直接跳到它。这种类型的XML解析从一开始就读取XML文档,直到您决定停止解析为止

编辑 更具体的代码

else if(eventType == XmlPullParser.TEXT) {
     //COLLECT DATA
     if(encounterId == 2) {
        if(elName.equalsIgnoreCase("name")) {
            this.name = xpp.getText();
         } else if(elName.equalsIgnoreCase("type"))  {
            this.race = xpp.getText();
         } else if(elName.equalsIgnoreCase("size")) {
            this.gender = xpp.getText(); 
         }
     }
 }

XMLPullParser将始终根据当前的程序编码方式读取整个文档。如果您只想打印id为2的生物的详细信息,您应该确保在文本事件类型If语句中记录该生物的名称、种族和性别之前,encounterId==2

XMLPullParser无法知道文档中的某个地方有ID为2的内容,而直接跳到它。这种类型的XML解析从一开始就读取XML文档,直到您决定停止解析为止

编辑 更具体的代码

else if(eventType == XmlPullParser.TEXT) {
     //COLLECT DATA
     if(encounterId == 2) {
        if(elName.equalsIgnoreCase("name")) {
            this.name = xpp.getText();
         } else if(elName.equalsIgnoreCase("type"))  {
            this.race = xpp.getText();
         } else if(elName.equalsIgnoreCase("size")) {
            this.gender = xpp.getText(); 
         }
     }
 }

您应该使用XPath

    XmlPullParser xpp = context.getResources().getXml(R.xml.zoo_table);
    XPath xpath = XPathFactory.newInstance().newXPath();
    try {
        String askFor2 = "//creature[@ID='2']";
        NodeList creaturesNodes = (NodeList) xpath.evaluate(askFor2, xpp, XPathConstants.NODESET);

        // here you have all such creatures - the list of one node in your case

您应该使用XPath

    XmlPullParser xpp = context.getResources().getXml(R.xml.zoo_table);
    XPath xpath = XPathFactory.newInstance().newXPath();
    try {
        String askFor2 = "//creature[@ID='2']";
        NodeList creaturesNodes = (NodeList) xpath.evaluate(askFor2, xpp, XPathConstants.NODESET);

        // here you have all such creatures - the list of one node in your case


xpp.next()不应该在while循环中吗?读取所有元素时不会发生循环(如果我理解的代码正确的话)。oops忘记将其粘贴到…编辑以显示它。谢谢捕获。xpp.next()不应该在while循环中吗?读取所有元素时不会发生循环(如果我理解的代码正确的话)。oops忘记将其粘贴到…编辑以显示它。谢谢捕获。哦,好的,那么如果我在启动XMLPullParser之前确定ID,我就可以这样做?如果(creatureID==2){//parse XML}等待,那就不起作用了,因为它永远不会到达那个XML,因为creatureID永远不会被设置为2。我编辑了我的答案,以便更准确地显示您需要做什么。显然,我假设您要做的不仅仅是打印这些信息,所以我没有处理其他打印语句。因此,我现在在运行代码之前确定并设置ID。我插入了if(encounterId==2)行。代码在XML中运行,但它总是将变量(this.name)设置为XML文件中列出的最后一项。不管我将encounterId设置为什么。哦,好吧,那么如果我在启动XMLPullParser之前确定ID,我就可以这样做?如果(creatureID==2){//parse XML}等待,那就不起作用了,因为它永远不会到达那个XML,因为creatureID永远不会被设置为2。我编辑了我的答案,以便更准确地显示您需要做什么。显然,我假设您要做的不仅仅是打印这些信息,所以我没有处理其他打印语句。因此,我现在在运行代码之前确定并设置ID。我插入了if(encounterId==2)行。代码在XML中运行,但它总是将变量(this.name)设置为XML文件中列出的最后一项。我将encounterId设置为什么并不重要。XPath是在SDK 8(2.2)中引入的。如果你有更老的安卓系统,你应该为它找到一些罐子。根据这个网站,有一些。在你上面写的示例代码中,你会在哪里使用askFor2?谢谢好的,我明白了。那么,我是否会像在我的原始代码中那样通过while循环来完成这个过程呢?如果您知道列表中只有一项,那么只能通过读取askFor2.getLength()来检查askFor2.item(0)是否存在
XPath.evalute()
需要
InputSource
Node
XmlPullParser
两者都不是-因此引发异常。XPath是在SDK 8(2.2)中引入的。如果你有更老的安卓系统,你应该为它找到一些罐子。根据这个网站,有一些。在你上面写的示例代码中,你会在哪里使用askFor2?谢谢好的,我明白了。那么,我是否会像在我的原始代码中那样通过while循环来完成这个过程呢?如果您知道列表中只有一项,那么只能通过读取askFor2.getLength()来检查askFor2.item(0)是否存在
XPath.evalute()
需要
InputSource
Node
XmlPullParser
两者都不是-因此引发异常。