How to skip specific element in SimpleXML
java, simple-framework, visitor-pattern
Solution
You could probably combine the approach suggested by `Raniz` with your `HiddenObjectVisitor`. Annotate `id` with `required=false` to avoid the `ValueRequiredException`, and then use your `HiddenObjectVisitor` to skip some of the `Voucher` objects during deserialization.
Based on the XML that you have shown, `id` is not required in the XML file, and that is what `required=false` indicates. But you imply that `id` is required in your deserialized objects, so you can discard the invalid objects at the time of deserialization.
Problem
I am using SimpleXML framework for deserializing backend answers. I made some assumptions about elements. Some elements do not meet these requirements. For example, I expect an element to have childs `<ID>` and `<face>`. If my user is not allowed to see a specific element, I might get an answer like this: ``` <list> <voucher type="hiddenobject"> <face>foo</face> </voucher> <voucher type="object"> <ID>42</ID> <face>bar</face> </voucher> </list> ``` Which gives me a ValueRequiredException for the following deserialization class: ``` @Root class Voucher { @Element(name="ID") private String id; @Element private String face; } ``` I would like to ignore these objects with type `hiddenobject`. I learned about the `VisitorStrategy` and implemented a simple `Visitor` like so: ``` 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 } } ``` and added this `Visitor` to a `VisitorStrategy` ``` VisitorStrategy strategy = new VisitorStrategy(new HiddenObjectVisitor()); ``` expecting that this would skip nodes during deserialization. I do get log entries stating that the node would be skipped. Anyway, the `VisitorStrategy` seems to keep parsing the node to be skipped, resulting in a `ValueRequiredException`. How can I ignore nodes having a given attribute? Is it possible to use `VisitorStrategy` for this task?