【问题标题】:how to parse nested elements using XmlPullparser?如何使用 XmlPullparser 解析嵌套元素?
【发布时间】:2015-03-14 15:33:35
【问题描述】:

这是我的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<frames>
<frame>
    <name>FRAME-A</name>
    <coordinatesA>
       <x>75</x>
       <y>75</y>
    </coordinatesA>
    <coordinatesB>
       <x>75</x>
       <y>490</y>
    </coordinatesB>
    <coordinatesC>
       <x>645</x>
       <y>75</y>
   </coordinatesC>
    <coordinatesD>
       <x>1215</x>
       <y>75</y>
    </coordinatesD>
    <coordinatesE>
        <x>0</x>
       <y>0</y>
    </coordinatesE>
    <image>@drawable/frameguideone</image>
</frame>

如何解析坐标A B C D E标签内的标签x和y?我不知道该怎么做。任何人都可以帮我解决这个问题吗?我在谷歌上找过,但没有得到我的解决方案。

这是我的java解析:

public class XMLPullParserHandler {
List<Employee> frames;
private Employee frame;
private String text;

public XMLPullParserHandler() {
    frames = new ArrayList<Employee>();
}

public List<Employee> getEmployees() {
    return frames;
}

public List<Employee> parse(InputStream is) {
    XmlPullParserFactory factory = null;
    XmlPullParser parser = null;
    try {
        factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        parser = factory.newPullParser();

        parser.setInput(is, null);

        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagname = parser.getName();
            switch (eventType) {
            case XmlPullParser.START_TAG:
                if (tagname.equalsIgnoreCase("frame")) {
                    // create a new instance of employee
                    frame = new Employee();
                }
                break;

            case XmlPullParser.TEXT:
                text = parser.getText();
                break;

            case XmlPullParser.END_TAG:
                if (tagname.equalsIgnoreCase("frame")) {
                    // add employee object to list
                    frames.add(frame);
                } else if (tagname.equalsIgnoreCase("name")) {
                    frame.setName(text);
                } else if (tagname.equalsIgnoreCase("coordinates")) {
                    frame.setCoordinates(Integer.parseInt(text));
                } else if (tagname.equalsIgnoreCase("image")) {
                    frame.setImage(text);
                }else if(tagname.equalsIgnoreCase("x")){
                    frame.setX(Integer.parseInt(text));
                }else if(tagname.equalsIgnoreCase("y")){
                    frame.setY(Integer.parseInt(text));
                }
                break;
            default:
                break;
            }
            eventType = parser.next();
        }

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return frames;
}

}

【问题讨论】:

    标签: android xml xml-parsing coordinates android-xmlpullparser


    【解决方案1】:

    您的代码有两个问题。

    首先,这行不通:

    if (tagname.equalsIgnoreCase("coordinates")) {
        frame.setCoordinates(Integer.parseInt(text));
    }
    

    您必须与 xml 标记具有相同的名称或使用 tagname.contains("coordinates")。

    其次,x 和 y 将始终等于 0,因为您正在用新值擦除以前的值。因此,您的 Employee 对象应该包含一个坐标列表,每次遇到坐标标签时,您应该创建一个新的 Coordinate 对象,设置 x 和 y 并将其添加到列表中。 像这样的东西应该可以工作:

    case XmlPullParser.START_TAG:
        if (tagname.equalsIgnoreCase("frame")) {
            frame = new Employee();
        } 
        else if (tagname.contains("coordinates")) {
            frame.addCoordinate(new Coordinate());
        } 
        break;
    
    case XmlPullParser.END_TAG:
        if (tagname.equalsIgnoreCase("x")) {
            // get the coordinate object created in the START_TAG case
            frame.getLastCoordinates().setX(Integer.parseInt(text));
        }
        else if (tagname.equalsIgnoreCase("y")) {
            frame.getLastCoordinates().setY(Integer.parseInt(text));
        }
    

    希望对您有所帮助!

    【讨论】:

    • 是的,它应该在您的坐标列表中添加一个元素。
    • 嗨,是的,我已经添加了它,但是我该怎么做 getLastCoordinates()?我已经在 logcat 中看到了它,但是当我尝试将它放在我的列表视图中时,它显示为 0 谢谢。
    • 例如,如果您使用 ArrayList 来获取最后一个元素,则可以使用以下方法:public Coordinates getLastCoordinates(){ return coordinatesList.get(coordinatesList.size() -1); } 这是其中一种方法,也许还有一种更有效的方法.
    • 谢谢我添加for循环:)
    【解决方案2】:

    当你读取坐标的开始标签时,创建一个新的坐标对象。在读取 x 和 y 时,设置坐标上的值。读取结束坐标标签时,设置框架上的坐标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 2015-02-09
      • 2015-09-28
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多