2013-06-07 4 views
1

Android에서 Java 객체로부터 XML을 생성해야합니다. XML 노드는 확실한 순서 여야합니다.Android에서 XStream을 사용할 때 특수 효과 주문 필드는 어떻게 사용하나요?

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Header> 
    <ID soap:mustUnderstand="1"> 
     <string>00001</string> 
    </ID> 
    </soap:Header> 
    <soap:Body> 
    <cwmp:Inform> 
     <DeviceId> 
     <Manufacturer>Conexant</Manufacturer> 
     <OUI>002615</OUI> 
     <ProductClass>ADSL2+ IAD</ProductClass> 
     <SerialNumber>00261559a496</SerialNumber> 
     </DeviceId> 
     <Event soapenc:arrayType="cwmp:EventStruct[1]"> 
     <EventStruct> 
      <EventCode>0 BOOTSTRAP</EventCode> 
      <CommandKey></CommandKey> 
     </EventStruct> 
     </Event> 
     <MaxEnvelopes>0</MaxEnvelopes> 
     <CurrentTime>2013-06-07 07:16:54.128 UTC</CurrentTime> 
     <RetryCount>0</RetryCount> 
     <ParameterList soapenc:arrayType="cwmp:ParameterValueStruct[1]"> 
     <ParameterValueStruct> 
      <name>InternetGatewayDevice.DeviceInfo.SpecVersion</name> 
      <value>1.0</value> 
     </ParameterValueStruct> 
     </ParameterList> 
    </cwmp:Inform> 
    </soap:Body> 
</soap:Envelope> 

나는이 문제를 더 조사했습니다

여기
<soap:Envelope xmlns:cwmp="urn:dslforum-org:cwmp-1-0" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
    <cwmp:Inform> 
     <CurrentTime>2013-06-07 07:11:20.561 UTC</CurrentTime> 
     <DeviceId> 
     <OUI>002615</OUI> 
     <Manufacturer>Conexant</Manufacturer> 
     <ProductClass>ADSL2+ IAD</ProductClass> 
     <SerialNumber>00261559a496</SerialNumber> 
     </DeviceId> 
     <Event soapenc:arrayType="cwmp:EventStruct[1]"> 
     <EventStruct> 
      <CommandKey></CommandKey> 
      <EventCode>0 BOOTSTRAP</EventCode> 
     </EventStruct> 
     </Event> 
     <ParameterList soapenc:arrayType="cwmp:ParameterValueStruct[1]"> 
     <ParameterValueStruct> 
      <name>InternetGatewayDevice.DeviceInfo.SpecVersion</name> 
      <value>1.0</value> 
     </ParameterValueStruct> 
     </ParameterList> 
     <MaxEnvelopes>1</MaxEnvelopes> 
     <RetryCount>0</RetryCount> 
    </cwmp:Inform> 
    </soap:Body> 
    <soap:Header> 
    <ID soap:mustUnderstand="1"> 
     <string>00001</string> 
    </ID> 
    </soap:Header> 
</soap:Envelope> 

내가이 원하는 무엇을 : 여기 (알파벳 순서에 따라 이러한 필드)를 얻었다 것입니다. 그리고 Xstream에서 필드를 처리하는 것으로 나타났습니다. Android에서 잘못된 순서입니다. Xstream은 Java 프로젝트에서 필드를 잘 처리합니다.

@XStreamAlias("cwmp:Inform") 
public class Inform { 
    @XStreamAlias("DeviceId") 
    private DeviceIdStruct  deviceId; 

    @XStreamAlias("Event") 
    private EventList   event; 

    @XStreamAlias("MaxEnvelopes") 
    private int     maxEnvelopes; 

    @XStreamAlias("CurrentTime") 
    private Date    currentTime; 

    @XStreamAlias("RetryCount") 
    private int     retryCount; 

    @XStreamAlias("ParameterList") 
    private ParameterValueList parameterList; 
} 
+0

@ Ігар Цімошка 도와 주시겠습니까? – Folee

답변

2

Here입니다.
나는이 문제를 조사하여 안드로이드가 필드 유형의 알파벳 순서로 필드를 반환한다고 결론을 내렸다. FieldKeySorter를 상속하여 주문을 설정할 수 있습니다.

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface XMLSequence { 
    String[] value(); 
} 

그리고 예제를 사용 :

public class SequenceFieldKeySorter implements FieldKeySorter { 
    @Override 
    public Map sort(final Class type, final Map keyedByFieldKey) { 
     Annotation sequence = type.getAnnotation(XMLSequence.class); 
     if (sequence != null) { 
      final String[] fieldsOrder = ((XMLSequence) sequence).value(); 
      Map result = new OrderRetainingMap(); 
      Set<Map.Entry<FieldKey, Field>> fields = keyedByFieldKey.entrySet(); 
      for (String fieldName : fieldsOrder) { 
       if (fieldName != null) { 
        for (Map.Entry<FieldKey, Field> fieldEntry : fields) { 
         if 
(fieldName.equals(fieldEntry.getKey().getFieldName())) { 
          result.put(fieldEntry.getKey(), 
fieldEntry.getValue()); 
         } 
        } 
       } 
      } 
      return result; 
     } else { 
      return keyedByFieldKey; 
     } 

    } 
} 

그리고 마지막으로 이동 : 그럼 난 FieldKeySorter 상속 한

@XMLSequence({ 
     "accountIds", 
     "addresses", 
     "birthDate", 
     "contact", 
     "name", 
     "status", 
}) 

먼저 당신은 필드 순서 정의하고 주석을 만들 필요 :

XStream x = new XStream(new PureJavaReflectionProvider(
new FieldDictionary(new SequenceFieldKeySorter()))); 
1
  1. 이 인터페이스 FieldKeySorter을 주문을 제어하려는 클래스에 구현할 수 있습니다.
  2. 사용자가 직접 주석을 작성할 수 있습니다.이 주석은 대상 클래스를 확장 할뿐만 아니라 런타임시 반영을 통해 FieldKeySorter를 구현합니다. 마지막으로 인스턴스를 대체하여 순서를 제어하십시오.
관련 문제