导航xml输入文件的层次结构

时间:2014-07-22 18:00:01

标签: java xml

如何在xml架构层次结构中列出给定级别的元素名称?我在下面的代码列出了层次结构的每个级别的所有元素名称,没有嵌套的概念。

这是我的xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="CDA.xsl"?>
<SomeDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:something">
<title>some title</title>
<languageCode code="en-US"/>
<versionNumber value="1"/>
<recordTarget>
    <someRole>
        <id extension="998991"/>
        <addr use="HP">
            <streetAddressLine>1357 Amber Drive</streetAddressLine>
            <city>Beaverton</city>
            <state>OR</state>
            <postalCode>97867</postalCode>
            <country>US</country>
        </addr>
        <telecom value="tel:(816)276-6909" use="HP"/>
    </someRole>
</recordTarget>
</SomeDocument>

这是我用于导入和迭代xml文件的java方法:

public static void parseFile() {
    //get the factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
        //Using factory get an instance of document builder
        DocumentBuilder db = dbf.newDocumentBuilder();
        //parse using builder to get DOM representation of the XML file
        Document dom = db.parse("D:\\mypath\\somefile.xml");
        //get the root element
        Element docEle = dom.getDocumentElement();
        //get a nodelist of elements
        NodeList nl = docEle.getElementsByTagName("*");
        if (nl != null && nl.getLength() > 0) {
            for (int i = 0; i < nl.getLength(); i++) {
                Node node = nl.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println("node.getNodeName() is: "+node.getNodeName());
                }

            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

上述程序的输出是:

title
languageCode
versionNumber
recordTarget
someRole
id
addr
streetAddressLine
city
state
postalCode
country
telecom

相反,我想输出以下内容:

title
languageCode
versionNumber
recordTarget

然后能够将recordTarget的子项列为someRole,然后将someRole的子项列为id,{{1 }和addr。依此类推,但由我自行决定。如何更改代码以获取我想要的输出?

2 个答案:

答案 0 :(得分:1)

您正在使用此行获取所有节点:

NodeList nl = docEle.getElementsByTagName("*");

将其更改为

NodeList nl = docEle.getChildNodes();

获得所有孩子。然后,您的print语句将为您提供所需的输出。

然后,当您遍历NodeList时,您可以选择在您创建的每个节点上调用相同的方法:

NodeList children = node.getChildNodes();

如果要打印类似XML的结构,可能正在寻找打印所有子节点的递归方法。

答案 1 :(得分:1)

您可以重新编写parseFile(我宁愿称之为parseChildrenElementNames)方法来获取输入String,该输入指定要打印出来的元素名称子元素名称:

public static void parseChildrenElementNames(String parentElementName) {
    // get the factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
        // Using factory get an instance of document builder
        DocumentBuilder db = dbf.newDocumentBuilder();
        // parse using builder to get DOM representation of the XML file
        Document dom = db
                .parse("D:\\mypath\\somefile.xml");
        // get the root element
        NodeList elementsByTagName = dom.getElementsByTagName(parentElementName);
        if(elementsByTagName != null) {
            Node parentElement = elementsByTagName.item(0);
            // get a nodelist of elements
            NodeList nl = parentElement.getChildNodes();
            if (nl != null) {
                for (int i = 0; i < nl.getLength(); i++) {
                    Node node = nl.item(i);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        System.out.println("node.getNodeName() is: "
                                + node.getNodeName());
                    }

                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但是,这只会考虑与指定名称匹配的第一个元素。

例如,要获取名为someRole的第一个节点下的元素列表,您可以调用parseChildrenElementNames("someRole");来打印出来:

node.getNodeName() is: id
node.getNodeName() is: addr
node.getNodeName() is: telecom