【问题标题】:Finding Closing XML tag查找关闭 XML 标记
【发布时间】:2013-03-20 15:39:18
【问题描述】:

我有一种方法可以只打印出打开和关闭 XML 标记之间的内容。我知道我的 XML 深度计数器是问题所在,但我不知道在哪里放置/修复它。这是 XML。

<XMS>
    <Object>
        <Property>
            <Value>1</Value>
        </Property>
    </Object>
</XMS>

这里是 Java 代码...

    Boolean flag = false;

    while(reader.hasNext()) {
        eventType = reader.next();

        if(getEventType(eventType) == "START_ELEMENT" 
                && reader.getLocalName() == startTagName){
            flag = true;
            depth++;
            System.out.println(reader.getLocalName() + " Depth = " + depth);
        }
        else if(getEventType(eventType) == "END_ELEMENT"
                && flag == true
                && (depth == 0)){
            depth--;
            System.out.println(reader.getLocalName() + " Depth = " + depth + " BIG END");
            break;
        }
        else if(getEventType(eventType) == "START_ELEMENT"
                && flag == true){
            depth++;
            System.out.println(reader.getLocalName() + " Depth = " + depth);
        }
        else if(getEventType(eventType)== "END_ELEMENT"
                && flag == true){
            depth--;
            System.out.println(reader.getLocalName() + " Depth = " + depth + " END");
        }
    }
}

GetEventType 只返回正确的 eventType(正常工作)。这是控制台的输出。

Object Depth = 1
Property Depth = 2
Value Depth = 3
Value Depth = 2 END
Property Depth = 1 END
Object Depth = 0 END
XMS Depth = -1 BIG END

问题是它应该在深度 = 0 时在最后一个对象上结束,并在到达 XMS 深度 = -1 之前停止。有什么建议吗?

【问题讨论】:

  • 你找到你的遮阳篷了吗?

标签: java xml parsing sax stax


【解决方案1】:

是否可以像比较深度是否等于 1 而不是 0 一样简单?

当您在“对象”元素中时,您的深度 == 1,因此当您遇到结尾的“对象”标签时,您应该检查

   ... && (depth == 1)

【讨论】:

    【解决方案2】:

    EventType 是 int 而不是字符串,您正在与错误的值进行比较。此外,您不要使用== 比较Java 中的字符串,而是使用equals()。此外,标志应该是boolean(原始)。

    作为将来的说明,当遇到此类问题时,请学习在调试器中运行代码以找到您的逻辑问题,而不是在 SO 上发布。

    【讨论】:

    • 对不起,我忘了提到我有一个方法可以将 int 转换为字符串进行比较 (getEventType(eventType))。我确实需要修复 == 与 equals() 但如果这不起作用,它根本不会给我任何输出。
    • 始终将字符串与.equals()进行比较
    【解决方案3】:

    在您的代码中

        else if(getEventType(eventType) == "END_ELEMENT"
                        && flag == true
                        && (depth == 0)){
                    depth--;
    //rest of your code
    

    您的 if 条件将 (depth == 0) 作为条件之一,并且在您的方法主体中您正在执行 depth--;。这不会将深度减少到 -1 吗?

    我的问题是:如果你有if (depth == 0),你真的需要做depth--;吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多