为什么这个Java方法没有返回所有XML元素?

时间:2012-12-08 16:10:31

标签: java xml

我正在从XML文档中读取DMX值。该方法只返回我想要拉出的元素中的一个节点,但应该有512个。

以下是方法:

public static void readXML(int cueNo){
        try {

            File fXmlFile = new File(MixWindow.Globals.fileLoc);
            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("Cue");
            System.out.println("-----------------------");

            for (int temp = 0; temp < nList.getLength(); temp++) {

               Node nNode = (Node) nList.item(temp);
               if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                  Element eElement = (Element) nNode;

                  System.out.println("Cue Name : " + getTagValue("Cue_Name", eElement));
                  System.out.println("Cue Number : " + getTagValue("Cue_Number", eElement));
                      //System.out.println("Nick Name : " + getTagValue("nickname", eElement));
                  //System.out.println("Salary : " + getTagValue("salary", eElement));

               }


            }
            NodeList nListII = doc.getElementsByTagName("DMX");
            //nListII = doc.getElementsByTagName("DMX");
            System.out.println("-----------------------");
            int length = nListII.getLength();
            System.out.println("DMX Length:  " + length);
            for (int tempII = 0; tempII < nListII.getLength(); tempII++) {

                   Node nNodeII = (Node) nListII.item(tempII);
                   if (nNodeII.getNodeType() == Node.ELEMENT_NODE) {

                      Element eElement = (Element) nNodeII;

                      System.out.println("DMX Chnl: " + getTagValue("DMX_Chnl", eElement));
                      System.out.println("DMX Val: " + getTagValue("DMX_Val", eElement));
                          //System.out.println("Nick Name : " + getTagValue("nickname", eElement));
                      //System.out.println("Salary : " + getTagValue("salary", eElement));

                   }


                }

          } catch (Exception e) {
            e.printStackTrace();
          }
    }
        private static String getTagValue(String sTag, Element eElement) {
            NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

            Node nValue = (Node) nlList.item(0);

            return nValue.getNodeValue();
        }
    }

以下是XML文件的一部分:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ShowFile>
<Cue>
<Cue_Name>stuff and junk</Cue_Name>
<Cue_Number>1</Cue_Number></Cue>
<DMX>
<DMX_Chnl>1</DMX_Chnl>
    <DMX_Val>0</DMX_Val>
<DMX_Chnl>2</DMX_Chnl>
    <DMX_Val>0</DMX_Val>
<DMX_Chnl>3</DMX_Chnl>
    <DMX_Val>0</DMX_Val>
<DMX_Chnl>4</DMX_Chnl>
        <DMX_Val>0</DMX_Val>
......
    <DMX_Chnl>512</DMX_Chnl>
        <DMX_Val>0</DMX_Val>

System.out创建了这个:

Cue Name : stuff and junk
Cue Number : 1
-----------------------
DMX Length:  1
DMX Chnl: 1
DMX Val : 0

我做错了什么?

缩短了xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><ShowFile><Cue><Cue_Name>Stuff and Junk</Cue_Name><Cue_Number>1</Cue_Number></Cue><DMX><DMX_Chnl>1</DMX_Chnl><DMX_Val>0</DMX_Val><DMX_Cue>1</DMX_Cue><DMX_Chnl>2</DMX_Chnl><DMX_Val>0</DMX_Val><DMX_Cue>1</DMX_Cue><DMX_Chnl>3</DMX_Chnl><DMX_Val>0</DMX_Val><DMX_Cue>1</DMX_Cue><DMX_Chnl>4</DMX_Chnl></DMX></ShowFile>

添加循环:

if (nNodeII.getNodeType() == Node.ELEMENT_NODE) {

                      Element eElement = (Element) nNodeII;

                      NodeList childNodes = nNodeII.getChildNodes();
                        String result = new String();
                        for (int i = 0; i < childNodes.getLength(); i++) {
                          Node node = childNodes.item(i);
                      String dcName = node.getNodeName();
                      String dcVal = node.getNodeValue();
                      System.out.println("DMX stuff:  " + dcName + " " + dcVal);
                                                }
                   }

1 个答案:

答案 0 :(得分:2)

Java和XML解析器的行为正确。

但是你希望文档的结构与实际结构不同!所以你在寻找节点的错误位置,因而没有在那里找到节点。

只有一个DMX 元素。您想要枚举 children ,而不是DMX元素。 (即你想拥有DMX_Chnl元素,而这些元素,每个元素都包含在一个单独的DMX节点中)