element.getAttribute()返回空String

时间:2014-04-11 13:43:55

标签: java xml xml-parsing

我正在尝试访问XML文件中的所有元素。这是文件的一部分(其余部分只是更多的和弦元素)

<?xml version="1.0" encoding="UTF-8"?>
<Chord-List>
<Chord name = "I">
<Note1>C</Note1>
<Note2>E</Note2>
<Note3>G</Note3>
</Chord>

<Chord name = "ii">
<Note1>D</Note1>
<Note2>F</Note2>
<Note3>A</Note3>
</Chord>
</Chord-List>

这是我的java代码。它将打印除属性值之外的所有内容,因此我认为getAttribute返回一个空字符串,但我不确定为什么

public static void main(String [] args){
    try{
        File fXmlFile = new File("/home/Ryan/workspace/ChoraleGenerator/Chords.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();
        System.out.println("Root element: " + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("Chord");
        System.out.println("----------------------------");

        for(int i = 0; i < nList.getLength(); i++){
            Node nNode = nList.item(i);
            System.out.println("\nCurrent Element:" + nNode.getNodeName());
            if(nNode.getNodeType() == Node.ELEMENT_NODE){
                Element eElement = (Element)nNode;

                System.out.println("Chord name: " + eElement.getAttribute("name"));
                System.out.println("Note 1: " + eElement.getAttribute("Note1"));
                System.out.println("Note 2: " + eElement.getAttribute("Note2"));
                System.out.println("Note 3: " + eElement.getAttribute("Note3"));

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

最后,这是我的输出: 根元素:Chord-List


当前元素:和弦

和弦名称:我

注1:

注2:

注3:

当前元素:和弦

和弦名称:ii

注1:

注2:

注3:

有什么建议吗?提前谢谢!

3 个答案:

答案 0 :(得分:2)

当然这不起作用。 Note1Note2Note3不是属性。他们是元素。

这个怎么样:

// Define a helper method
private static String getChildElementContent(Element e, String childName) {
    NodeList children = e.getElementsByTagName(childName);
    if(children.getLength() > 0) {
        return children.item(0).getTextContent();
    }
    return "";
}

然后做:

System.out.println("Note 1: " + getChildElementContent(eElement, "Note1"));
System.out.println("Note 2: " + getChildElementContent(eElement, "Note2"));
System.out.println("Note 3: " + getChildElementContent(eElement, "Note3"));

答案 1 :(得分:1)

您对没有属性的节点使用getAttribute方法。

您可能想要使用的是getTextContent()方法。

以下是属性与文字的示例:

<nodeName attribute0="value0" attribute1="value1">textContent</nodeName>

答案 2 :(得分:0)

eElement.getAttribute("Note1")

错误,因为Note1不是属性,而是<Chord>元素下面的元素。您将需要获取此元素,然后获取该元素中的文本节点。