使用android中的SAXParser访问XML中的子节点

时间:2013-02-24 02:28:05

标签: java android xml saxparser

我的XML树有以下结构:

<building id="5" name="Barracks" hp="2000" >
    <cost metal="100" wood = "300"></cost>
    <unit id="1" name="Swordsman" hp="40" attack="3"/>
    <tech id="1" name="Research Heavy Swordsman"/>
</building>

这是我用来访问它的代码:

public void startElement(String uri, String localName,String qName, 
                    Attributes attributes) throws SAXException {
            int civId=0, id=0;
            if(qName.equalsIgnoreCase("building"))
            {
                inBuilding = true;
                building = true;
                //Fetching the ID of TownCenter, we use it as a reference to fetch the child nodes.
                id = Integer.parseInt(attributes.getValue("id"));
                if(id==5)
                {
                    XMLfetch.put("id", attributes.getValue("id"));
                    XMLfetch.put("name", attributes.getValue("name"));
                    XMLfetch.put("hp", attributes.getValue("hp"));
                    ......
                }               
            }
            if(inBuilding && id==5){ //<----- Condition which matters
                if(qName.equalsIgnoreCase("cost")){

                    Log.i("resources", "Wood "+attributes.getValue("wood"));
                    Log.i("resources", "MetaL "+attributes.getValue("metal"));

                    XMLfetch.put("costWood", attributes.getValue("wood"));
                    XMLfetch.put("costMetal", attributes.getValue("stone"));

                }               
            }
        }

        // END ELEMENT here     
                @Override
                 public void endElement(String uri, String localName, String qName) throws SAXException {

                    if(inBuilding)
                    {
                        if(qName.equalsIgnoreCase("building")) {
                              building=false;
                              //inBuilding=false;
                              }
                        if(qName.equalsIgnoreCase("cost")){
                            inBuilding=false;
                        }
                    }

                 }

现在的问题是,我无法进入标签内部。我无法访问其属性,没有。如果我从我提到的行中删除“id == 5”的条件,代码将从整个树中获取所有成本值。但是,当我提出条件时,它什么都没有! :( ...

请帮忙。谢谢了很多!

1 个答案:

答案 0 :(得分:0)

它解决了!我已经将inBuilding变量声明在错误的位置。 :( ....因此,变量被重写,我无法检测到我在哪里。感谢所有阅读它并试图给出解决方案的人。:) civId和id变量在startElement内声明( ),这意味着他们每次都会被重写....因此他们没用。它们需要在任何不会被重写的地方声明。谢谢ianhanniballake