2016-10-25 12 views
9

저는 백엔드 답변을 역 직렬화하기 위해 SimpleXML 프레임 워크를 사용하고 있습니다. 나는 요소에 대해 몇 가지 가정을했다. 일부 요소는 이러한 요구 사항을 충족하지 못합니다. 예를 들어 요소에 <ID><face>의 하위 항목이 있어야합니다.SimpleXML의 특정 요소를 건너 뛰는 방법

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

을하고이 직렬화 복원시에 노드를 건너 뛸 것이라고 기대하고 VisitorStrategy

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

Visitor을 추가했습니다. 나는 로그 엔트리가 노드가 스킵 될 것이라는 것을 알게된다. 어쨌든 VisitorStrategy은 노드 구문 분석을 계속 건너 뛴 것으로 보입니다. 따라서 ValueRequiredException이됩니다.

주어진 속성이있는 노드는 어떻게 무시합니까? 이 작업에 VisitorStrategy을 사용할 수 있습니까?

+0

** ActiveVoucher ** extends ** Voucher ** 클래스를 사용하는 것이 좋습니다. * Active Voucher *에는 필수 속성이 있지만 * Voucher *에는 필수 속성이 없습니까? –

답변

5

당신은 아마 당신의 HiddenObjectVisitor으로 Raniz에 의해 제안 된 접근 방식을 결합 할 수 있습니다. idrequired=false으로 지정하여 ValueRequiredException을 피한 다음 HiddenObjectVisitor을 사용하여 deserialization 중에 Voucher 개체 중 일부를 건너 뜁니다.

표시 한 XML에 따라 id은 XML 파일에 필요하지 않으며 그 내용은 required=false입니다. 그러나 비 직렬화 된 객체에는 id이 필요하므로 직렬화 해제 할 때 잘못된 객체를 삭제할 수 있습니다.

4

ID를 optional으로 표시하고 형식 속성을 포함 시켜서 비 직렬화 후에 필터링 할 수 있습니다. 그들이 직렬화 복원 된 후

@Root 
class Voucher { 
    @Attribute 
    private String type; 

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

    @Element 
    private String face; 
} 

그런 다음 상품권을 필터링 할 수 있습니다

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

고마워요,하지만 이미 그것에 대해 생각했습니다. 유효한 객체에 대한 가정을 계속하고 싶습니다. 예를 들어, .equals()에서 ID를 사용합니다. 여기에는 null ID가있는 것이 좋지 않습니다. – Jeremy