2016-10-25 21 views
9

Tôi đang sử dụng khung công tác SimpleXML để deserializing câu trả lời phụ trợ. Tôi đã đưa ra một số giả định về các yếu tố. Một số yếu tố không đáp ứng các yêu cầu này. Ví dụ: tôi mong đợi một phần tử có con <ID><face>. Nếu người dùng của tôi không được phép để xem một yếu tố cụ thể, tôi có thể nhận được một câu trả lời như thế này:Làm thế nào để bỏ qua phần tử cụ thể trong SimpleXML

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

nào mang lại cho tôi một ValueRequiredException cho lớp deserialization sau:

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

    @Element 
    private String face; 
} 

Tôi muốn bỏ qua các đối tượng này với loại hiddenobject. Tôi đã học được về VisitorStrategy và thực hiện một cách đơn giản Visitor như vậy:

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 
    } 
} 

và thêm Visitor này cho một người VisitorStrategy

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

mong rằng điều này sẽ bỏ qua các nút trong deserialization. Tôi nhận được các mục nhập nhật ký cho biết rằng nút sẽ bị bỏ qua. Dù sao, các VisitorStrategy dường như tiếp tục phân tích cú pháp nút để bỏ qua, dẫn đến một ValueRequiredException.

Làm cách nào để bỏ qua các nút có thuộc tính nhất định? Có thể sử dụng VisitorStrategy cho tác vụ này không?

+0

bạn nên có lớp ** ActiveVoucher ** mở rộng ** Phiếu thưởng **, trong đó * ActiveVoucher * có các thuộc tính bắt buộc, trong khi * Voucher * sẽ không có thuộc tính bắt buộc? –

Trả lời

5

Bạn có thể có thể kết hợp các phương pháp được đề xuất bởi Raniz với HiddenObjectVisitor của bạn. Chú thích id với required=false để tránh ValueRequiredException và sau đó sử dụng HiddenObjectVisitor để bỏ qua một số đối tượng Voucher trong quá trình deserialization.

Dựa trên XML mà bạn đã hiển thị, id không bắt buộc trong tệp XML và đó là những gì required=false cho biết. Nhưng bạn ngụ ý rằng id là bắt buộc trong các đối tượng được deserialized của bạn, vì vậy bạn có thể loại bỏ các đối tượng không hợp lệ tại thời điểm deserialization.

4

Một điều bạn có thể làm là đánh dấu ID là optional và bao gồm thuộc tính loại để bạn có thể lọc sau khi deserialisation.

@Root 
class Voucher { 
    @Attribute 
    private String type; 

    @Element(name="ID", required=false) 
    private String id; 

    @Element 
    private String face; 
} 

Sau đó bạn có thể lọc các chứng từ sau khi họ đã được deserialised:

// Deserialise the XML 
List<Voucher> vouchers = ...; 

// Filter the list of vouchers 
List<Voucher> nonHiddenVouchers = new ArrayList<>(); 
for (Voucher voucher : vouchers) { 
    if (!"hiddenobject".equals(voucher.getType())) { 
     nonHiddenVouchers.add(voucher); 
    } 
} 
+0

Cảm ơn, nhưng tôi đã nghĩ về điều đó. Tôi muốn giữ các giả định của mình về các đối tượng hợp lệ. Ví dụ, tôi sử dụng ID trong .equals(), ở đó sẽ là xấu khi có một ID rỗng. – Jeremy

Các vấn đề liên quan