【问题标题】:SimpleXML - how to ignore duplicate tags in bad XML?SimpleXML - 如何忽略错误 XML 中的重复标签?
【发布时间】:2015-07-26 11:54:41
【问题描述】:

我正在使用 java SimpleXML 来解析来自多个应用程序的 XML。

许多应用程序为这个假定的“标准”创建了古怪的 XML 实现,例如多次放入“启用”标签。

在这种情况下,我只想忽略第二个,因为它是一个错误并且与第一个具有相同的值,但是 SimpleXML 抛出异常“元素'已启用'已被使用”

如何防止这种情况发生?

这是被投诉的领域。

@Element(required = false)
protected boolean enabled = true;

XML 很大,所以不想发布它。有没有办法让 SimpleXML 报告导致错误的行号?

【问题讨论】:

  • 你能举个例子吗?
  • 更新显示java字段注释,但是大量的XML,所以宁愿追踪确切的行号来发布sn-p。有没有办法获取行号?
  • 我还有一个问题。即使我使用的是 Root(strict = false) 和 read(strict=false),simplexml 仍然是严格的。我真的希望它忽略问题。
  • 你不能先使用 XSLT 来预处理 XML 以删除重复的标签,然后使用 SimpleXML 来解析它...要使用 XSLT 删除重复的元素,你可以点击链接 stackoverflow.com/questions/10912544/…
  • 接下来我会尝试这样做,但我希望首先让 SimpleXML 停止严格的验证。我似乎无法关闭它,但不知道为什么。我希望在非严格模式下它可能会简单地忽略该属性的第二个设置。任何想法为什么它可能会忽略我关闭严格的尝试?

标签: java xml xml-parsing simple-framework


【解决方案1】:

尝试以下注释:

   class RepeatElements {
      @ElementListUnion({
         @ElementList(entry = "enable", 
           type = Boolean.class, inline = true)
        })
      private ArrayList<Boolean> enables = new ArrayList<>();

      public boolean isEnabled() {
        // TODO check size
        return enables.get(0).booleanValue();
      }
    }

带有一些“启用”的RepeatElements类的输出

    <repeatElements>
        <enable>true</enable>
        <enable>true</enable>
        <enable>true</enable>
    </repeatElements>

【讨论】:

  • 谢谢,这会奏效。我正在考虑这样做作为最后的手段。但是我仍然对为什么不能关闭严格验证感到完全困惑。有什么想法吗?
  • 我认为如果你用@Element(required=false)注释类属性enabled,simple-framework需要一个或零个名为“启用”的xml元素,strict=false simple-framework会跳过其他元素名称比“启用”,两个或更多名称为“启用”的元素是一个错误,无法跳过
  • 在这里您可以找到带有示例的要点gist.github.com/momolinus/5104fa890936d0cd58dd
猜你喜欢
  • 2014-07-13
  • 2023-03-24
  • 2016-11-11
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多