2012-12-08 58 views
-1

我正在从XML文档读取DMX值。该方法只返回一个节点上,而我试图从拉动因素,但应该有512为什么此Java方法不返回所有XML元素?

这里是方法:

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); 
               } 
        } 
+0

可以缩短你的XML文件,并提供完整的缩短Xml和其输出吗?目前,我无法确定第二次提到'Cue Name'和'Cue Number'来自哪里?如果我正确地得到你的代码,为了实现这个目标,你的Xml文档中必须有几个''元素,对吧? –

+1

从您的XML看起来您有512个DMX_Chnl和512个DMX_Val元素,但只有一个DMX。 – mazaneicha

回答

2

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

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

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

+0

我认为这是我需要做的。当我遍历孩子时,我可以返回节点名称,但所有的值都返回null。我将添加上面的循环。 –

+0

注意文字节点。你可能有很多文本节点只包含你实际寻找的元素之间的换行符。 –

+0

基于xpath的API可能比您目前使用的这个低级API更方便。实际上,XML Pull API也可能适用于您。 –

相关问题