Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DOM4J解析XML文件_Java_Parsing_Xml Parsing_Dom4j - Fatal编程技术网

Java 使用DOM4J解析XML文件

Java 使用DOM4J解析XML文件,java,parsing,xml-parsing,dom4j,Java,Parsing,Xml Parsing,Dom4j,我在解析XML时遇到问题 我有以下方法: public void componentsInfoToSimulation(String houseDivision, String equipment) { Element root = doc.getRootElement(); pt.ipp.isep.gecad.masgrip.Simulation.getHouseNamesOfComponents().add(equipment); for (

我在解析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>

360
360
360
0.25
15
1500
800
1500
0.25
15
0
200
200
0.25
15
如果我的程序是“浓缩咖啡机”,我应该有以下输出:

[浓缩咖啡机] [360] [360] [360] [0.25] [15]

然而,结果是这样的:

[浓缩咖啡机] [] [] [] [] []


我想当我使用
innerElement.getTextTrim()
时,问题出在开关/案例中,但我不确定。您能帮我解决这个问题吗?

在解析文档的过程中,代码中出现了一些错误,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);
               }
            }
         }
      }
   }
注意有多个设备元素。它们由ID标识。不需要所有元素都不同。它们都代表一种通用的“设备”


360
360
360
0.25
15
1500
800
1500
0.25
15
0
200
200
0.25
15

这只是建议使用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
        }
    }
String expression=String.format(
“/components/house[@id='%s']/*[@id='%s']/*”,houseDivision,
设备);
@抑制警告(“未选中”)
列表元素=doc.selectNodes(表达式);
对于(元素e:元素){
开关(如getName()){
案例“权力”:
打破
案例“最小功率”:
打破
//等
}
}

我已更改了XML文件,但仍然无法使用。我不知道为什么。我有相同的输出
    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
        }
    }