使用DOM迭代包含一些具有相同名称的标签的NodeList

Yan*_*key 6 java xml tags dom loops

我正在尝试使用Java中的DOM读取XML

<?xml version="1.0"?>
<record>
<user>
    <name>Leo</name>
    <email>****@****.com</email>
        <food-list>
            <food>Hamburgers</food>
            <food>Fish</food>
        </food-list>
</user>
</record>
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是

    for (int userNumber = 0; userNumber < masterList.getLength(); userNumber++) {

           Node singleUserEntry = masterList.item(userNumber);
           if (singleUserEntry.getNodeType() == Node.ELEMENT_NODE) {

              org.w3c.dom.Element userEntryElement = (org.w3c.dom.Element) singleUserEntry;



              System.out.println("name : " + getTagValue("name", userEntryElement));
              System.out.println("email : " +getTagValue("email", userEntryElement));
              NodeList foodList = userEntryElement.getElementsByTagName("food-list").item(0).getChildNodes();
              for(int i = 0; i < foodList.getLength(); i++){
                  Node foodNode = foodList.item(i);
                  System.out.println("food : " + foodNode.getNodeValue());
              }

private static String getTagValue(String sTag, org.w3c.dom.Element eElement) {
     NodeList nlList =  eElement.getElementsByTagName(sTag).item(0).getChildNodes();
     Node nValue = (Node) nlList.item(0);
     return nValue.getNodeValue();
Run Code Online (Sandbox Code Playgroud)

而现在的输出是

name : Leo 
email : ******@*****.com
food :          
food : null
food :          
food : null
food : 
Run Code Online (Sandbox Code Playgroud)

这让我很困惑.你能告诉我哪里错了吗?食物标签的数量未预先定义.

old*_*inb 4

((Node) foodNode.getChildNodes().item(0)).getNodeValue()
Run Code Online (Sandbox Code Playgroud)

请注意,正如您可以清楚地看到的,在 Java 中处理 DOM API 是相当痛苦的。您看过JDOMdom4j吗?