3

我首先要说我不太擅长 Java 或 XML。

我下面的代码就像我需要的那样打印出子节点。我没有编写代码,我在此处的帮助站点上找到了它:Java XML Example。现在,我需要它做的是删除所有特异性痕迹。这意味着我不希望它搜索“TITLE”或“CD”,我希望它找出第一个节点是什么并打印出来。这意味着如果第一个是 CD,那么它应该为所有节点打印 CD,依此类推。我计划将它用于多个 XML 文件,但它们都不相同。这就是为什么不特定于一个 XML 并使用引号很重要的原因。

最后,为了让您了解我想要的输出,基本上是一个 CSV 文件。顶部的标题,用逗号分隔,下面的内容,用逗号分隔。为此,我还需要一个打印方法,在顶部列出标题的所有节点。我不确定如何做到这一点。

编辑:我的问题是,如何在不硬编码的情况下打印标签名称(例如标题)。我希望它也可以处理一个与 CD 或音乐无关的 XML 文件。

//This should be the final result:
Title, Artist, Album,
On Fire, Eminem, Recovery,
Not Afraid, Eminem, Recovery,

//I want this code without hardcoding headers like Title inside it. 
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("TITLE");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
System.out.print(((Node) fstNm.item(0)).getNodeValue()+", ");
4

2 回答 2

1

答案就在问题中。使用getChildNodes(), 并遍历返回列表中的节点。对于每个节点,您可以使用

if (node.getNodeType() == Node.ELEMENT_NODE)

并且,如果为真,您可以使用获取元素的标签名称

Element element = (Element) node; 
String elementName = element.getTagName();
于 2013-02-09T13:57:42.667 回答
1

完全独立于元素名称的代码:

boolean titlePrinted = false;
Element root = doc.getDocumentElement();
NodeList cdNodes = root.getChildNodes();
for (int i = 0; i < cdNodes.getLength(); i++) {
    Node cdNode = cdNodes.item(i);
    if (cdNode.getNodeType() == Node.ELEMENT_NODE) {
        NodeList cdAttrNodes = cdNode.getChildNodes();
        if (!titlePrinted) {
            for (int j = 0; j < cdAttrNodes.getLength(); j++) {
                Node cdAttrNode = cdAttrNodes.item(j);
                // add this if statement
                if (cdAttrNode.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.print(cdAttrNode.getNodeName() + ",");
                }
            }
            System.out.println("");
            titlePrinted = true;
        }
        for (int j = 0; j < cdAttrNodes.getLength(); j++) {
            Node cdAttrNode = cdAttrNodes.item(j);
            if (cdAttrNode.getNodeType() == Node.ELEMENT_NODE) {
                NodeList attrNodes = cdAttrNode.getChildNodes();
                for (int k = 0; k < attrNodes.getLength(); k++) {
                    Node attrNode = attrNodes.item(k);
                    if (attrNode.getNodeType() == Node.TEXT_NODE) {
                        System.out.print(attrNode.getNodeValue() + ",");
                    }
                }
            }
        }
        System.out.println("");
    }
}

根据您的建议进行了测试.xml。我的解决方案适用于节点而不是独立的元素。

于 2013-02-09T14:09:53.590 回答