1

我有一个 xml 文档,它作为字符串保存在变量 xmlRequest 中。我想检查此 xml 文档中是否有特定的 xml 元素。我有这样的解决方案,但我认为这是一个糟糕的解决方案:

if (xmlRequest.contains("<Initial>") && xmlRequestBody.contains("</Initial>")) {
   // do something specific for <Initial> 
}
if (xmlRequest.contains("<Area>") && xmlRequestBody.contains("</Area>")) {
   // do something for <Area>
}
if (xmlRequest.contains("<Circle>") && xmlRequestBody.contains("</Circle>")) {
   // do something for <Circle>
}

If Else 的构造也很糟糕,因为 if 案例的数量可能会增长得非常高。我认为开关盒是解决此问题的最佳方法,但我该如何构建它,因为也使用布尔比较。

4

3 回答 3

3

看起来您正在使用自定义代码进行 XML 解析。这通常不是一个好主意,最好使用解析器。并且使用一些解析器,您的结构会发生足够的变化,以至于问题会变得有些无关紧要。

但是根据解析器的不同,关于代码结构(尤其是ifor的长列表if...else if)的问题可能仍然存在,所以我将解决它:

if...else if在这里是正确的构造,除非可能同时满足多个条件,并且您希望在每种情况下都进行工作。如果是这样,那么您所拥有的 ( if...if) 是正确的构造。

switch除非您正在测试的东西是常量或枚举,否则在这里没有用处。您正在使用contains,因此不适用。Java 不允许在cases 中使用表达式,它们必须是常量或枚举(引用),因此if...else if或者if...if是您可以对正在使用的字符串做的最好的事情。

嗯,不,实际上:你可以(如果有很多这些,如你所说,可能应该)重构该代码以使用命令模式和循环,例如(伪代码):

TagCommands[] commands = /* ...objects that have the tag name
                               and function to call... */;
for (TagCommands command : commands) {
   if (command.matches(xmlRequest, xmlRequestBody) {
       command.execute(/*...relevant args here...*/);
   }
}

...哪里TagCommand看起来像这样:

interface TagCommand {
    void setTag(String tag);
    String getTag();
    boolean matches(String request, String requestBody);
    void execute(/*...relevant args here...*/);
}

...可能与

abstract class TagCommandBase implements TagCommand {

    private String tag;

    TagCommandBase(String tag) {
        this.setTag(tag);
    }

    void setTag(String tag) {
        this.tag = tag;
    }

    String getTag() {
        return this.tag;
    }

    boolean matches(String request, String requestBody) {
        return request.contains("<" + this.getTag() + ">") &&
               requestBody.contains("</" + this.getTag() + ">");
        }
    }
}

...然后你创建你的数组,TagCommand使用实现的每个标记的具体实现execute(声明的类或匿名类)。

于 2013-07-10T08:58:36.573 回答
3

简而言之:在这种情况下,您不能使用 switch case 语句,因为它只能检查值是否相等。

无论如何,您应该研究Java XML 解析而不是自己做。

于 2013-07-10T08:59:50.017 回答
-4

您至少需要使用 Java 7 - 请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html上标题为“在 switch 语句中使用字符串”的部分

于 2013-07-10T09:03:09.967 回答