我正在使用 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
}
}
并添加了这个 Visitor
到 VisitorStrategy
VisitorStrategy strategy = new VisitorStrategy(new HiddenObjectVisitor());
预计这会在反序列化期间跳过节点。我确实收到了表明该节点将被跳过的日志条目。无论如何,VisitorStrategy
似乎一直在解析要跳过的节点,导致 ValueRequiredException
.
如何忽略具有给定属性的节点?是否可以使用 VisitorStrategy
为了这个任务?
最佳答案
您可能可以结合 Raniz
建议的方法用你的HiddenObjectVisitor
.注释 id
与 required=false
避免 ValueRequiredException
, 然后使用你的 HiddenObjectVisitor
跳过一些 Voucher
反序列化期间的对象。
根据您显示的 XML,id
在 XML 文件中不需要,这就是 required=false
表明。但是你暗示id
在反序列化的对象中是必需的,因此您可以在反序列化时丢弃无效的对象。
关于java - 如何跳过 SimpleXML 中的特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40237164/