Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android XML解析在第一个子级时停止_Android_Xml_Xmlpullparser - Fatal编程技术网

Android XML解析在第一个子级时停止

Android XML解析在第一个子级时停止,android,xml,xmlpullparser,Android,Xml,Xmlpullparser,我正在尝试解析如下所示的XML文件: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <cartoonia xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <stagione nome="Cartoonia Speciale due per vedere se funziona"> <puntata>

我正在尝试解析如下所示的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cartoonia xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <stagione nome="Cartoonia Speciale due per vedere se funziona">
        <puntata>
            <numero>0</numero>
            <titolo>Ciao Cipo</titolo>
            <link>http://www.dimaleinpentium.com/app/download/5429764359/Cartoonia+%288%5E+Puntata%29.mp3?t=1389213968</link>
            <descrizione>Ma ciao mia bella Cipo</descrizione>
        </puntata>
    </stagione> 
    <stagione nome="Stagione 1">
        <puntata>
            <numero>1</numero>
            <titolo>Puntata 1</titolo>
            <link>http://www.dimaleinpentium.com/app/download/5424302459/Cartoonia+1%5E+Puntata.mp3?t=1383736417</link>
            <descrizione>Descrizione</descrizione>
        </puntata>
        <puntata>
            <numero>2</numero>
            <titolo>Puntata 2</titolo>
            <link>http://www.dimaleinpentium.com/app/download/5425828359/Cartoonia+%282%5E+Puntata%29.mp3?t=1384351442</link>
            <descrizione>Descrizione</descrizione>
        </puntata>
        <puntata>
            <numero>3</numero>
            <titolo>Puntata 3</titolo>
            <link>http://www.dimaleinpentium.com/app/download/5427087659/Cartoonia+%283%5E+Puntata%29.mp3?t=1384981673</link>
            <descrizione>Descrizione Puntata</descrizione>
        </puntata>
    </stagione>
    <stagione nome="Cartoonia Special!">
        <puntata>
            <numero>0</numero>
            <titolo>Ciao Cipo</titolo>
            <link>http://www.dimaleinpentium.com/app/download/5429764359/Cartoonia+%288%5E+Puntata%29.mp3?t=1389213968</link>
            <descrizione>Ma ciao mia bella Cipo</descrizione>
        </puntata>
    </stagione> 
</cartoonia>

0
再见
http://www.dimaleinpentium.com/app/download/5429764359/Cartoonia+%288%5E+Puntata%29.mp3?t=1389213968
你好,我是贝拉·西波
1.
蓬塔塔1号
http://www.dimaleinpentium.com/app/download/5424302459/Cartoonia+1%5E+Puntata.mp3?t=1383736417
描述
2.
蓬塔塔2号
http://www.dimaleinpentium.com/app/download/5425828359/Cartoonia+%282%5E+Puntata%29.mp3?t=1384351442
描述
3.
蓬塔塔3
http://www.dimaleinpentium.com/app/download/5427087659/Cartoonia+%283%5E+Puntata%29.mp3?t=1384981673
潘塔塔酒店
0
再见
http://www.dimaleinpentium.com/app/download/5429764359/Cartoonia+%288%5E+Puntata%29.mp3?t=1389213968
你好,我是贝拉·西波
有了这段代码(取自AndroidDevs并进行了修改以适合我的文件),我只能先读取
,其他代码则被忽略

public Map < String, List < Entry >> parse(InputStream in ) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput( in , null);
        parser.nextTag();
        return readFeed(parser);
    } finally { in .close();
    }
}


private Map < String, List < Entry >> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    Map < String, List < Entry >> entries = new HashMap < String, List < Entry >> ();
    String index = "";
    parser.require(XmlPullParser.START_TAG, ns, "cartoonia");
    while (parser.next() != XmlPullParser.END_TAG) {
        Log.d(TAG, "> " + parser.getLineNumber() + " <");
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        Log.d(TAG, "" + name);

        if (name.equals("stagione")) {
            index = parser.getAttributeValue(null, "nome");
            Log.d(TAG, "    " + index);
            entries.put(index, new ArrayList < Entry > ());
        } else if (name.equals("puntata")) {
            Log.d(TAG, "        Entry: " + parser.getName());
            List < Entry > en = entries.get(index);
            en.add(readEntry(parser));
        } else {
            skip(parser);
        }
    }
    return entries;
}

// Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them off
// to their respective "read" methods for processing. Otherwise, skips the tag.
private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "puntata");
    String title = null;
    String summary = null;
    String link = null;
    String number = null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        if (name.equals("titolo")) {
            title = readTitle(parser);
        } else if (name.equals("numero")) {
            number = readNumber(parser);
        } else if (name.equals("descrizione")) {
            summary = readSummary(parser);
        } else if (name.equals("link")) {
            link = readLink(parser);
        } else {
            skip(parser);
        }
    }
    return new Entry(title, number, summary, link);
}
publicmap>解析(InputStream-in)抛出XmlPullParserException,IOException{
试一试{
XmlPullParser=Xml.newPullParser();
setFeature(XmlPullParser.FEATURE_进程_名称空间,false);
setInput(in,null);
parser.nextTag();
返回readFeed(解析器);
}最后{in.close();
}
}
私有映射>readFeed(XmlPullParser解析器)抛出XmlPullParserException,IOException{
Map>entries=newhashmap>();
字符串索引=”;
require(XmlPullParser.START_标记,ns,“cartonia”);
while(parser.next()!=XmlPullParser.END_标记){

Log.d(TAG,“>”+parser.getLineNumber()+”实际上,我不明白这里的意思,看起来你认为“stagione”和“puntata”是邻居标记,但它们不是邻居,“puntata”是“stagione”的元素,所以,你需要在每个“stagione”中创建另一个解析器来读取“puntata”的

if(name.equals(“stagione”)){
index=parser.getAttributeValue(null,“nome”);
Log.d(标记“”+索引);
输入(索引,新数组列表());
}else if(名称等于(“puntata”)){
Log.d(标记,“条目:”+parser.getName());
Listen=entries.get(索引);
en.add(readEntry(解析器));
}

问题在于循环条件:

while (parser.next() != XmlPullParser.END_TAG) { ...
您将
END\u标记
END\u文档
混在一起。我将为您添加一个适合您的实现的示例。我添加了尽可能多的注释。请看以下内容:

int eventType;

while ((eventType = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
  String current_tag = null;
  switch (eventType) {
    case XmlPullParser.START_DOCUMENT:
      // Do the pertinent initializations here (if you need, if not, just break)
      break;

    case XmlPullParser.START_TAG:
      current_tag = parser.getName();               // Get current tag
      if (current_tag.equals("cartoonia")
        continue;
      else if (current_tag.equals("stagione"))      // Initialize a new object to store a "stagione", probably add the name from "nome"
        myStagione = new WhatEver(); 
      else if (current_tag.equals("puntata"))       // Do the proper initialization to store a "puntata"
        myPuntata = new WhatEver2(); 
      else if (myPuntata != null) {                 // Just do the same!
        ...
      }

      break;

    case XmlPullParser.END_TAG:                     // This is called if you terminated processing a tag, not at the end of the XML file!
      current_tag = parser.getName();
      ...

      break;
    }

  eventType = parser.next();                        // Next event
}

不是一个大文件。请尝试逐步使用调试器。这似乎是一个逻辑问题,而不是语法错误…在这种情况下调试有用吗?您可以打赌调试会有帮助。这是一个小文件,您可以在几分钟内完成。我的
START\u标记
是“cartonia”,所以我认为
END\u标记
是“cartonia”“再一次。我错了吗?在前面的步骤中,我的XML没有任何“stagione”,它只是
,所有的“puntata”标记都被处理过。我认为你确实错了,你有几个
开始标记
标记,你必须区分它们(用
如果
句子).
END\u标记
将匹配
,因此这是模拟过程,您需要区分它们并正确处理数据,但主要的是,您的循环条件是
END\u标记
,因此您的循环在第一个上退出,而这不是您想要的,只需在
END上迭代即可_文档
。我不是说你错了,但为什么“stagione”中的所有“puntata”都被处理,而只有第一个“stagione”被处理?我的意思是,如果
结束标记
将同时匹配
,那么它应该在第一个
处停止……我需要了解这种情况,因此感谢您的帮助:)我认为这是因为当其中一个条件匹配时,您将
parser
传递给您的函数,而不是
parser.nextText()
,它将返回您刚才处理的下一项。我看不到这些函数的内容,但您是否通过
parser.nextText()获取这些项
?顺便说一句,你不会只有2个
START\u标签
END\u标签
,而是3个,因为你的
cartonia
标签也很重要。
START\u文档
简单地说你正处于文档的边缘,但还没有读取任何内容,所以你也必须处理第三个标签。更多信息请点击此处
int eventType;

while ((eventType = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
  String current_tag = null;
  switch (eventType) {
    case XmlPullParser.START_DOCUMENT:
      // Do the pertinent initializations here (if you need, if not, just break)
      break;

    case XmlPullParser.START_TAG:
      current_tag = parser.getName();               // Get current tag
      if (current_tag.equals("cartoonia")
        continue;
      else if (current_tag.equals("stagione"))      // Initialize a new object to store a "stagione", probably add the name from "nome"
        myStagione = new WhatEver(); 
      else if (current_tag.equals("puntata"))       // Do the proper initialization to store a "puntata"
        myPuntata = new WhatEver2(); 
      else if (myPuntata != null) {                 // Just do the same!
        ...
      }

      break;

    case XmlPullParser.END_TAG:                     // This is called if you terminated processing a tag, not at the end of the XML file!
      current_tag = parser.getName();
      ...

      break;
    }

  eventType = parser.next();                        // Next event
}