2013-07-30 40 views
0

解析XML時遇到問題。使用DOM4J解析XML文件

我有以下方法:

public void componentsInfoToSimulation(String houseDivision, String equipment) { 
     Element root = doc.getRootElement(); 
     pt.ipp.isep.gecad.masgrip.Simulation.getHouseNamesOfComponents().add(equipment); 

     for (Iterator i = root.elementIterator("house"); i.hasNext();) { 
      Element element = (Element) i.next(); 

      if (element.attributeValue("id").equals(houseDivision)) { 

       for (Iterator j = element.elementIterator("" + houseDivision); j.hasNext();) { 
        Element innerElement = (Element) j.next(); 

        if (innerElement.attributeValue("id").equals(equipment)) { 

         for (Iterator k = innerElement.elementIterator("" + equipment); k.hasNext();) { 
          Element innerSubElement = (Element) k.next(); 

          String op = innerSubElement.getQualifiedName(); 
          switch (op) { 
           case "power": 
            pt.ipp.isep.gecad.masgrip.Simulation.getHousePowerDosComponents().add(Integer.parseInt(innerSubElement.getTextTrim())); 
            break; 
           case "min_power": 
            pt.ipp.isep.gecad.masgrip.Simulation.getHouseMinPowerComponents().add(Integer.parseInt(innerSubElement.getTextTrim())); 
            break; 

           case "max_power": 
            pt.ipp.isep.gecad.masgrip.Simulation.getHouseMaxPowerComponents().add(Integer.parseInt(innerSubElement.getTextTrim())); 
            break; 

           case "average_usage_hour": 
            pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageHoursPerDay().add(Float.parseFloat(innerSubElement.getTextTrim())); 
            break; 

           case "average_usage_minute": 
            pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageMinutesPerDay().add(Float.parseFloat(innerSubElement.getTextTrim())); 
            break; 

           default: 
            break; 
          } 
         } 
        } 
       } 
      } 
     } 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHouseNamesOfComponents()); 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHousePowerDosComponents()); 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHouseMinPowerComponents()); 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHouseMaxPowerComponents()); 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageHoursPerDay()); 
     System.out.println("" + pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageMinutesPerDay()); 

    } 

這是我的XML文件的樣本:

<components> 
    <house id="Kitchen"> 
     <espresso_machine id="espresso machine"> 
      <power>360</power> 
      <min_power>360</min_power> 
      <max_power>360</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </espresso_machine> 
     <coffee_machine id="coffee machine"> 
      <power>1500</power> 
      <min_power>800</min_power> 
      <max_power>1500</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </coffee_machine> 
     <coffee_pot id="coffee pot"> 
      <power>0</power> 
      <min_power>200</min_power> 
      <max_power>200</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </coffee_pot> 
    </house> 
</components> 

如果我有我的節目的「咖啡機」我應該有以下輸出:

[espresso_machine] [360] [360] [360] [0.25] [15]

但是,它出來是這樣的:

[espresso_machine] [] [] [] [] []

我的事情問題出在交換機/我使用innerElement.getTextTrim()時的情況,但我不確定。你能幫我解決這個問題嗎?

回答

1

代碼中存在一些錯誤,如何解析文檔以及需要更新的XML文件中的某些內容。請參閱下面更新的代碼和XML文檔。我在評論中添加了所以你可以遵循邏輯。

電話方法:

componentsInfoToSimulation("Kitchen", "espresso machine"); 

方法:

public static void componentsInfoToSimulation(String houseDivision, String equipment) 
    { 
     Element root = doc.getRootElement(); 

     // Iterate over the houses 
     for (Iterator i = root.elementIterator("house"); i.hasNext();) 
     { 
     Element houseElement = (Element) i.next(); 

     // Check if the id of one the house elements equals the houseDivision 
     String houseId = houseElement.attributeValue("id"); 
     if (houseId.equals(houseDivision)) 
     { 
      // Iterate over the equipment for the house 
      for (Iterator x = houseElement.elementIterator("equipment"); x.hasNext();) 
      { 
       Element equipmentElement = (Element) x.next(); 

       // Check if the id of one the equipment elements equals the 
       // equipment 
       String equipId = equipmentElement.attributeValue("id"); 
       if (equipId.equals(equipment)) 
       { 
        // Get all the elemnts and their values 
        int power = Integer.valueOf(equipmentElement.element("power").getTextTrim()); 
        int minPower = Integer.valueOf(equipmentElement.element("min_power").getTextTrim()); 
        int maxPower = Integer.valueOf(equipmentElement.element("max_power").getTextTrim()); 
        float averageUsageHours = Float.valueOf(equipmentElement.element("average_usage_hour").getTextTrim()); 
        float averageUsageMins = Float.valueOf(equipmentElement.element("average_usage_minute").getTextTrim()); 

        // Update the model 
        pt.ipp.isep.gecad.masgrip.Simulation.getHouseNamesOfComponents().add(equipment); 
        pt.ipp.isep.gecad.masgrip.Simulation.getHousePowerDosComponents().add(power); 
        pt.ipp.isep.gecad.masgrip.Simulation.getHouseMinPowerComponents().add(minPower); 
        pt.ipp.isep.gecad.masgrip.Simulation.getHouseMaxPowerComponents().add(maxPower); 
        pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageHoursPerDay().add(averageUsageHours); 
        pt.ipp.isep.gecad.masgrip.Simulation.getHouseAverageUsageMinutesPerDay().add(averageUsageMins); 
       } 
      } 
     } 
     } 
    } 

請注意有多個設備構成。他們由他們的身份證明。沒有必要讓所有元素都不同。它們都代表了一種通用的「設備」。

<components> 
    <house id="Kitchen"> 
     <equipment id="espresso machine"> 
      <power>360</power> 
      <min_power>360</min_power> 
      <max_power>360</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </equipment> 
     <equipment id="coffee machine"> 
      <power>1500</power> 
      <min_power>800</min_power> 
      <max_power>1500</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </equipment> 
     <equipment id="coffee pot"> 
      <power>0</power> 
      <min_power>200</min_power> 
      <max_power>200</max_power> 
      <average_usage_hour>0.25</average_usage_hour> 
      <average_usage_minute>15</average_usage_minute> 
     </equipment> 
    </house> 
</components> 
+0

我已經更改了我的XML文件,但仍然無法工作。我不知道爲什麼。我有同樣的輸出 – SaintLike

+0

沒關係,我正在嘗試以前的版本。非常感謝 – SaintLike

0

這只是建議使用XPath而不是顯式導航。切斷代碼量非常顯着:

String expression = String.format(
      "/components/house[@id='%s']/*[@id='%s']/*", houseDivision, 
      equipment); 
    @SuppressWarnings("unchecked") 
    List<Element> elements = doc.selectNodes(expression); 
    for (Element e : elements) { 
     switch (e.getName()) { 
     case "power": 
      break; 
     case "min_power": 
      break; 
        // etc 
     } 
    }