java - 如何跳过 SimpleXML 中的特定元素

标签 java simple-framework visitor-pattern

我正在使用 SimpleXML 框架反序列化后端答案。我对元素做了一些假设。有些元素不符合这些要求。例如,我希望一个元素有子元素 <ID><face> .如果不允许我的用户查看特定元素,我可能会得到这样的答案:

<list>
  <voucher type="hiddenobject">
    <face>foo</face>
  </voucher>
  <voucher type="object">
    <ID>42</ID>
    <face>bar</face>
  </voucher>
</list>

这为我提供了以下反序列化类的 ValueRequiredException:

@Root
class Voucher {
  @Element(name="ID")
  private String id;

  @Element
  private String face;
}

我想忽略这些类型为 hiddenobject 的对象.我了解了 VisitorStrategy并实现了一个简单的 Visitor像这样:

private static final class HiddenObjectVisitor implements Visitor {

    @Override
    public void read(Type type, NodeMap<InputNode> node) throws Exception {
        String nodeType = node.getNode().getAttribute("type").getValue();

        if (nodeType != null && nodeType.equals("hiddenobject")) {
            Log.d(TAG, "skipping node " + node);
            node.getNode().skip();
        }
    }

    @Override
    public void write(Type type, NodeMap<OutputNode> node) throws Exception {
        // stub
    }
}

并添加了这个 VisitorVisitorStrategy

VisitorStrategy strategy = new VisitorStrategy(new HiddenObjectVisitor());

预计这会在反序列化期间跳过节点。我确实收到了表明该节点将被跳过的日志条目。无论如何,VisitorStrategy似乎一直在解析要跳过的节点,导致 ValueRequiredException .

如何忽略具有给定属性的节点?是否可以使用 VisitorStrategy为了这个任务?

最佳答案

您可能可以结合 Raniz 建议的方法用你的HiddenObjectVisitor .注释 idrequired=false避免 ValueRequiredException , 然后使用你的 HiddenObjectVisitor跳过一些 Voucher反序列化期间的对象。

根据您显示的 XML,id在 XML 文件中不需要,这就是 required=false表明。但是你暗示id在反序列化的对象中是必需的,因此您可以在反序列化时丢弃无效的对象。

关于java - 如何跳过 SimpleXML 中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40237164/

相关文章:

java - JAX-WS Web 方法中的自定义线程

java - 如何使用文件 channel 作为参数来写入对象

java - 如何获取android assets的绝对路径

java - 如何在 Java 中为 DAG 结构创建迭代器包装器?

c++ - 添加调试工具以增强变体访问者

java - 如何使 jar 文件在重启或系统启动后自动运行

java - Kotlin + Spring Boot,找不到 beans

java - 使用简单 XML 序列化 TimeUnit

Java - 使用 SimpleXML 获取 ElementList 属性 (Android/Retrofit)

visitor-pattern - 访客行为模式的优点和缺点是什么?