如何跳过SimpleXML中的特定元素

Jer*_*emy 9 java visitor simple-framework

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

<list>
  <voucher type="hiddenobject">
    <face>foo</face>
  </voucher>
  <voucher type="object">
    <ID>42</ID>
    <face>bar</face>
  </voucher>
</list>
Run Code Online (Sandbox Code Playgroud)

这给了我以下反序列化类的ValueRequiredException:

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

  @Element
  private String face;
}
Run Code Online (Sandbox Code Playgroud)

我想用类型忽略这些对象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
    }
}
Run Code Online (Sandbox Code Playgroud)

并将此添加VisitorVisitorStrategy

VisitorStrategy strategy = new VisitorStrategy(new HiddenObjectVisitor());
Run Code Online (Sandbox Code Playgroud)

期望在反序列化期间这会跳过节点.我确实得到了日志条目,表明将跳过该节点.无论如何,VisitorStrategy似乎继续解析要跳过的节点,导致a ValueRequiredException.

如何忽略具有给定属性的节点?是否可以VisitorStrategy用于此任务?

Enw*_*red 5

您可以将建议的方法Raniz与您的方法结合起来HiddenObjectVisitor.注释idrequired=false避免ValueRequiredException,然后用你HiddenObjectVisitor跳过一些的Voucher反序列化过程中的对象.

根据您显示id的XML,XML文件中不需要,这就是required=false指示的内容.但是您暗示id在反序列化对象中需要这样做,因此您可以在反序列化时丢弃无效对象.