XML SAX 处理程序中逻辑的 Java 帮助

标签 java xml parsing sax handler

我正在尝试设置一个 SAX 处理程序来解析具有以下结构的 XML:

<Hours>
  <Set name="BUSINESS">
        <MO>
              <Open>09:00:00</Open>
              <Close>17:00:00</Close>
        </MO>
        <TU>
              <Open>09:00:00</Open>
              <Close>17:00:00</Close>
        </TU>
        <WE>
              <Open>09:00:00</Open>
              <Close>17:00:00</Close>
        </WE>
        <TH>
              <Open>09:00:00</Open>
              <Close>17:00:00</Close>
        </TH>
        <FR>
              <Open>09:00:00</Open>
              <Close>17:00:00</Close>
        </FR>
        <SA/>
        <SU/>
  </Set>
  <Set name="LASTCOLLECTION">
        <MO>
              <Close>17:00:00</Close>
        </MO>
        <TU>
              <Close>17:00:00</Close>
        </TU>
        <WE>
              <Close>17:00:00</Close>
        </WE>
        <TH>
              <Close>17:00:00</Close>
        </TH>
        <FR>
              <Close>17:00:00</Close>
        </FR>
        <SA/>
        <SU/>
  </Set>
 </Hours>

但是,我遇到了一些问题。我的代码只会真正获取 MO 中的 OPEN 和 CLOSE 值,而不是一周中的任何其他日子。谁能找出我的逻辑缺陷吗?这是我的处理程序代码:

public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    if (localName.equalsIgnoreCase("Set")
            && attributes.getValue("name").equalsIgnoreCase(
                    "BUSINESS")) {
        inBusiness = true;
    } else if (localName.equalsIgnoreCase("Set")
            && attributes.getValue("name").equalsIgnoreCase(
                    "LASTCOLLECTION")) {
        inLastCollection = true;
    } else if (localName.equalsIgnoreCase("MO")) {
        inMonday = true;
    } else if (localName.equalsIgnoreCase("TU")) {
        inTuesday = true;
    } else if (localName.equalsIgnoreCase("WE")) {
        inWednesday = true;
    } else if (localName.equalsIgnoreCase("TH")) {
        inThursday = true;
    } else if (localName.equalsIgnoreCase("FR")) {
        inFriday = true;
    } else if (localName.equalsIgnoreCase("SA")) {
        inSaturday = true;
    } else if (localName.equalsIgnoreCase("SU")) {
        inSunday = true;
    } else if (localName.equalsIgnoreCase("Open")) {
        inOpen = true;
    } else if (localName.equalsIgnoreCase("Close")) {
        inClose = true;
    }

}

public void characters(char ch[], int start, int length)
        throws SAXException {

    value = value + new String(ch, start, length).trim();

}

public void endElement(String uri, String name, String qName)
        throws SAXException {

    if (inBusiness) {

        bHours = new BusinessHours();

        if (inMonday) {

            if (inOpen) {
                bHours.setMondayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setMondayClose(value);
                inClose = false;
            }
            inMonday = false;

        } else if (inTuesday) {
            if (inOpen) {
                bHours.setTuesdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setTuesdayClose(value);
                inClose = false;
            }
            inTuesday = false;
        } else if (inWednesday) {
            if (inOpen) {
                bHours.setWednesdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setWednesdayClose(value);
                inClose = false;
            }
            inWednesday = false;
        } else if (inThursday) {
            if (inOpen) {
                bHours.setThursdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setThursdayClose(value);
                inClose = false;
            }
            inThursday = false;
        } else if (inFriday) {
            if (inOpen) {
                bHours.setFridayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setFridayClose(value);
                inClose = false;
            }
            inFriday = false;
        } else if (inSaturday) {
            if (inOpen) {
                bHours.setSaturdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setSaturdayClose(value);
                inClose = false;
            }
            inSaturday = false;
        } else if (inSunday) {
            if (inOpen) {
                bHours.setSundayOpen(value);
                inOpen = false;
            } else if (inClose) {
                bHours.setSundayClose(value);
                inClose = false;
            }
            inSunday = false;

        }
        myLoc.setBusinessHours(bHours);
        inBusiness = false;
    } else if (inLastCollection) {

        cHours = new LastCollectionHours();

        if (inMonday) {

            if (inOpen) {
                cHours.setMondayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setMondayClose(value);
                inClose = false;
            }
            inMonday = false;

        } else if (inTuesday) {
            if (inOpen) {
                cHours.setTuesdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setTuesdayClose(value);
                inClose = false;
            }
            inTuesday = false;
        } else if (inWednesday) {
            if (inOpen) {
                cHours.setWednesdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setWednesdayClose(value);
                inClose = false;
            }
            inWednesday = false;
        } else if (inThursday) {
            if (inOpen) {
                cHours.setThursdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setThursdayClose(value);
                inClose = false;
            }
            inThursday = false;
        } else if (inFriday) {
            if (inOpen) {
                cHours.setFridayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setFridayClose(value);
                inClose = false;
            }
            inFriday = false;
        } else if (inSaturday) {
            if (inOpen) {
                cHours.setSaturdayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setSaturdayClose(value);
                inClose = false;
            }
            inSaturday = false;
        } else if (inSunday) {
            if (inOpen) {
                cHours.setSundayOpen(value);
                inOpen = false;
            } else if (inClose) {
                cHours.setSundayClose(value);
                inClose = false;
            }
            inSunday = false;

        }
        myLoc.setLastCollectionHours(cHours);
        inLastCollection = false;
    }

}
<小时/>

更新的代码:

public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    value = new String();

    if (localName.equalsIgnoreCase("Set")
            && attributes.getValue("name").equalsIgnoreCase("BUSINESS")) {
        currentElement = 1;
        bHours = new BusinessHours();

    } else if (localName.equalsIgnoreCase("Set")
            && attributes.getValue("name").equalsIgnoreCase(
                    "LASTCOLLECTION")) {
        currentElement = 2;
        cHours = new LastCollectionHours();
    } else if (localName.equalsIgnoreCase("MO")) {
        day = 1;
    } else if (localName.equalsIgnoreCase("TU")) {
        day = 2;
    } else if (localName.equalsIgnoreCase("WE")) {
        day = 3;
    } else if (localName.equalsIgnoreCase("TH")) {
        day = 4;
    } else if (localName.equalsIgnoreCase("FR")) {
        day = 5;
    } else if (localName.equalsIgnoreCase("SA")) {
        day = 6;
    } else if (localName.equalsIgnoreCase("SU")) {
        day = 7;
    } else if (localName.equalsIgnoreCase("Open")) {
        open = 1;
    } else if (localName.equalsIgnoreCase("Close")) {
        open = 2;
    }

}

public void characters(char ch[], int start, int length)
        throws SAXException {

    value = value + new String(ch, start, length).trim();

} // end Method Characters

public void endElement(String uri, String name, String qName)
        throws SAXException {

    if (name.equalsIgnoreCase("Set") && currentElement == 1) {
        myLoc.setBusinessHours(bHours);
    } else if (name.equalsIgnoreCase("Set") && currentElement == 2) {
        myLoc.setLastCollectionHours(cHours);

    }

    if (currentElement == 1) {

        if (day == 1) {

            if (open == 1) {
                bHours.setMondayOpen(value);
            } else if (open == 2) {
                bHours.setMondayClose(value);
            }

        } else if (day == 2) {

            if (open == 1) {
                bHours.setTuesdayOpen(value);
            } else if (open == 2) {
                bHours.setTuesdayClose(value);
            }
        } else if (day == 3) {

            if (open == 1) {
                bHours.setWednesdayOpen(value);
            } else if (open == 2) {
                bHours.setWednesdayClose(value);
            }
        } else if (day == 4) {

            if (open == 1) {
                bHours.setThursdayOpen(value);
            } else if (open == 2) {
                bHours.setThursdayClose(value);
            }
        } else if (day == 5) {

            if (open == 1) {
                bHours.setFridayOpen(value);
            } else if (open == 2) {
                bHours.setFridayClose(value);
            }
        } else if (day == 6) {

            if (open == 1) {
                bHours.setSaturdayOpen(value);
            } else if (open == 2) {
                bHours.setSaturdayClose(value);
            }
        } else if (day == 7) {

            if (open == 1) {
                bHours.setSundayOpen(value);
            } else if (open == 2) {
                bHours.setSundayClose(value);
            }

        }

    } else if (currentElement == 2) {

        if (day == 1) {

            if (open == 1) {
                cHours.setMondayOpen(value);
            } else if (open == 2) {
                cHours.setMondayClose(value);
            }

        } else if (day == 2) {

            if (open == 1) {
                cHours.setTuesdayOpen(value);
            } else if (open == 2) {
                cHours.setTuesdayClose(value);
            }
        } else if (day == 3) {

            if (open == 1) {
                cHours.setWednesdayOpen(value);
            } else if (open == 2) {
                cHours.setWednesdayClose(value);
            }
        } else if (day == 4) {

            if (open == 1) {
                cHours.setThursdayOpen(value);
            } else if (open == 2) {
                cHours.setThursdayClose(value);
            }
        } else if (day == 5) {

            if (open == 1) {
                cHours.setFridayOpen(value);
            } else if (open == 2) {
                cHours.setFridayClose(value);
            }
        } else if (day == 6) {

            if (open == 1) {
                cHours.setSaturdayOpen(value);
            } else if (open == 2) {
                cHours.setSaturdayClose(value);
            }
        } else if (day == 7) {

            if (open == 1) {
                cHours.setSundayOpen(value);
            } else if (open == 2) {
                cHours.setSundayClose(value);
            }

        }

    }

}

谢谢!

最佳答案

在第 116 行上,您正在设置 inBusiness = false - 它将在周一开盘/收盘后设置。下一次,第 44 行的 if(inBusiness) 会失败。

不要使用 inBusiness boolean 值,而是使用 int 指示器,如下所示:

私有(private) int curElement = 0;

public void startElement(字符串 uri, 字符串 localName, 字符串 qName, 属性属性)抛出 SAXException {

if (localName.equalsIgnoreCase("Set")
        && attributes.getValue("name").equalsIgnoreCase(
                "BUSINESS")) {
    curElement = 1;
} else if (localName.equalsIgnoreCase("Set")
        && attributes.getValue("name").equalsIgnoreCase(
                "LASTCOLLECTION")) {
    curElement = 2;
}

……

}

public void endElement(字符串 uri, 字符串名称, 字符串 qName) 抛出 SAXException {

if (curElement == 1) {

    ....
    //Remove inBusiness= false;
} else if (curElement == 2) {
    ...
    //Remove inLastCollection = false;
}

}

关于XML SAX 处理程序中逻辑的 Java 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4321083/

相关文章:

java - 如何从 jUnit 测试访问 Spring @Service 对象

c# - '对象'不包含 'GetSqlXml' 的定义

php - 未定义 $_GET [' ...' ] 索引

c++ - 是否可以在 C++ 中使用递归 vector ?

java - 想要在用户选择后将来自 Java UI 的原始字符串解析为 SQL 查询字符串吗?

java - 链表添加结合前后位置的元素

java - 任何现有的 Apache Wicket 框架示例?

java - 从 Spring Boot 1.1.5 升级到 1.1.6 后,gradle 构建失败,:bootRepackage task 中出现 "Duplicate library commons-io-1.3.2.jar"

java - 解释拉解析器错误消息

C# 解析无名称的Json文件