简体   繁体   中英

XPath attribute parsing

getAttribute("...") in the first loop works fine but in the second(for 'effect' tag) it returns null. "Length of atts: " always 0. I just can't understand why it fails :( 'effectElement.getTagName()' returns 'effect' as it should.

XML:

<card id="1" card_type="door" name="cleric_1">
    <img>c_cleric_1</img>
    <slot>6</slot>
    <size>small</size>
    <value>0</value>
    <curse>false</curse>
    <effects>
        <effect type="ClassChangeEffect" args="Cleric"></effect>
    </effects>
</card>

JAVA:

........ >
        NodeList nodeList = (NodeList) xpath.evaluate("/list/card", doc, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element elem = (Element) node;
                String type = elem.getAttribute("card_type");
                String name = elem.getAttribute("name");
                String imgPath = elem.getElementsByTagName("img").item(0).getTextContent();
                BodySlot bodySlot = BodySlot.getSlotByIndex(Integer.parseInt(elem.getElementsByTagName("slot").item(0).getTextContent()));
                ItemSize itemSize = elem.getElementsByTagName("size").item(0).getTextContent().equals("big") ? ItemSize.BIG : ItemSize.SMALL;
                int value = Integer.parseInt(elem.getElementsByTagName("value").item(0).getTextContent());
                boolean isCurse = Boolean.getBoolean(elem.getElementsByTagName("curse").item(0).getTextContent());
                List<Effect> effectsList = new ArrayList<Effect>();

                NodeList effectsNodeList = elem.getElementsByTagName("effects");
                for (int j = 0; j < effectsNodeList.getLength(); j++) {
                    Node effectNode = effectsNodeList.item(j);
                    if (effectNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element effectElement = (Element) effectNode;
                        System.out.println("Length of atts: " + effectElement.getAttributes().getLength());
                        String effectName = effectElement.getAttribute("type");
                        String[] args = effectElement.getAttribute("args").split(",");
                        effectsList.add(effectCreator(effectName, args));
                    }
                }
                < ........
            }
        }

You're missing one nested loop or statement:

            NodeList effectsNodeList = elem.getElementsByTagName("effects");

Here you get list of effects elements. So you need to add one more for each element from the above list:

            NodeList effectNodeList = effectsElement.getElementsByTagName("effect");

And then loop over as you already do...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM