XML DOM的Java DOM解析无法从子子节点获取属性

时间:2013-06-06 20:04:30

标签: java xml parsing dom

我正在尝试使用java中的DOM解析器解析XML文档。我需要获取各种属性的值。我正在尝试解析以下文档:

<?xml version="1.0" encoding="UTF-8"?>
<BirthResults>
    <Results>
        <Rejected>
            <Reject>
                <Birth Etg = "etg1"/>
                <Causes>
                    <Cause Code = "test1" Desc = "Desc1"/>
                </Causes>
            </Reject>
            <Reject>
                <Birth Etg = "etg2"/>
                <Causes>
                    <Cause Code = "test2" Desc = "Desc2"/>
                </Causes>
            </Reject>
        </Rejected>
    </Results>
</BirthResults>

使用以下代码:

import java.io.InputStream;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.ksoap2.serialization.SoapObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Parsers {

    String Etg, Dob, Breed, Brd, Sex, EId, GdEtg, SuEtg, SiEtg, BLoc, BSLoc,
            PLoc, PSLoc, Code, Desc;
    static String response;

    public String Birth(InputStream in) {

        try {

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(in);

            doc.getDocumentElement().normalize();

            try {
                NodeList list = doc.getElementsByTagName("Reject");
                int L = list.getLength();

                for (int x = 0; x < L; x++) {

                    setNull();

                    Node node = list.item(x);
                    NodeList sublist = node.getChildNodes();

                    for (int y = 0; y < sublist.getLength(); y++) {
                        Node finNode = (Node) sublist.item(y);
                        if (finNode.getNodeType() == Node.ELEMENT_NODE) {
                            Element fin = (Element) finNode;
                            getAttributes(fin);
                        }
                    }
                }
            }catch(Exception e){}
        }catch(Exception e){}
    }

    private void getAttributes(Element fin) {
        Etg = fin.getAttribute("Etg");
        Code = fin.getAttribute("Code");
        System.out.println(Etg + ":" + Code);
    }
}

虽然我得到Etg out的值,但Code和Desc的值将返回为空白。我假设这是因为它们嵌入了更深层次的“层”,但我不知道如何解决这个问题。

非常感谢。

1 个答案:

答案 0 :(得分:3)

NodeList sublist = node.getChildNodes();分配给子列表子项,表示已分配节点:Birth, CausesCauses节点包含子项列表,因此,如果您的finNodeBirth元素,则可以获得Egt attr,但如果finNodeCauses你必须得到孩子,然后你可以从'原因'的每个孩子那里阅读CodeDesc

要检查元素名称,您可以使用fin.getTagName()