1

我正在制作一个应用程序,它将通过 xml 访问 ebay api 来搜索项目。我已按照指南 Android 开发人员指南 XMLPullParser使用 Pull 解析器,并且能够很好地解析基本的 xml。但是对于我的需要,pullparser 上没有足够的信息,因为我正在尝试以链接和 pullparser 站点中均未提及的格式访问项目。

产品项目在项目数组中。在返回第一个项目后尝试运行解析器时,解析器将返回到 Item 数组级别,而不是为每个项目循环。这导致解析器运行整个 xml 并且只返回一项。尝试了几天后,我尝试的任何方法都无法阻止解析器返回到 Item Array 级别。

这是XML的结构

     <FindPopularItemsResponse>
     <Timestamp>2013-04-08T18:30:44.139Z</Timestamp>
    <Ack>Success</Ack>
    <Build>E817_CORE_APILW2_15902151_R1</Build>
    <Version>817</Version>
    <ItemArray>
     <ItemID>330624952975</ItemID><EndTime>2013-05-03T13:31:06.000Z</EndTime> 
      <ViewItemURLForNaturalSearch></ViewItemURLForNaturalSearch>
       <ListingType>FixedPriceItem</ListingType><GalleryURL></GalleryURL>
        <PrimaryCategoryID>73522</PrimaryCategoryID><PrimaryCategoryName>  
        </PrimaryCategoryName><BidCount>706</BidCount><ConvertedCurrentPrice 
         currencyID="USD">14.95</ConvertedCurrentPrice>
        <ListingStatus>Active</ListingStatus><TimeLeft>P24DT19H22S</TimeLeft>
        <Title>    </Title>
    </ItemArray>
    </FindPopularItemsResponse>

谢谢

卢克

4

3 回答 3

0

没有任何代码,这实际上是一个很难回答的问题。

您的循环结构应该如下所示:

while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
    case XmlPullParser.START_TAG:
        if (xpp.getName().compareTo("ItemID") == 0) { // new item found
            // handle the whole item here if the format is static
        }
        // other stuff
        break;
    case XmlPullParser.END_TAG:
        // TODO
        break;
    case XmlPullParser.TEXT:
        // TODO
        break;
    }
于 2013-04-08T19:46:52.117 回答
0

您提供的 xml 中只有一项。如果您的示例中没有多个项目,则很难正确回答。但我会尝试只使用 ItemID。创建一个 ItemID 列表,当您点击该节点的文本时,将一个新 ItemID 添加到列表中。

创建对象列表并跟踪当前节点

List<ItemID> bdxr = new ArrayList<ItemID>();

...

String N = "";  // I know it's upper case but its one character and important

...

if (eventType == XmlPullParser.START_TAG) {
    N = xpp.getName(); // current node

...


} else if (eventType == XmlPullParser.TEXT) {
if (N.equals("ItemID")) {
        // create an ItemID Object and add the text to it
        bdxr.add(new ItemID(xpp.getText()); 

...


} else if (eventType == XmlPullParser.END_TAG) {
    N = ""; // no current node.

祝你好运,将项目添加到列表中,一个简单的 xpp 循环

于 2013-08-30T17:54:30.733 回答
0

你还没有完全指定你试图从 xml 中提取什么数据,所以....假设你想要来自每个标签的数据,我会这样做

int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
        String name;

        String itemID, endTime, viewItemURLForNaturalSearch, listingType;

        switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                Log.d("Ebay  ", " Start of Document");
                break;

            //look for the starting tag "item array" in the xml
            case XmlPullParser.START_TAG:


                name = parser.getName();
                if(name.equalsIgnoreCase("ItemArray")) {

           /*to handle nested tags. 
           "parser.nextTag()" goes to the next starting tag  immediately following "ItemArray",
           and "itemID = parser.nextText()" assigns the text within that tag 
            to the string itemID*/

                    parser.nextTag();
                    itemID = parser.nextText();
                    Log.d("Listing ", itemID);

                    parser.nextTag();
                    endTime = parser.nextText();
                    Log.d("Listing ", endTime);

                    parser.nextTag();
                    viewItemURLForNaturalSearch = parser.nextText();
                    Log.d("Listing ", viewItemURLForNaturalSearch);

                    parser.nextTag();
                    listingType = parser.nextText();
                    Log.d("Listing ", listingType);

                }


                break;

        }

        eventType = parser.next();
    }

希望这可以帮助。

于 2016-01-30T21:33:21.143 回答