2016-08-01 118 views
2

我必須解析XML文件中的元素,可以是兩種類型:的SimpleXML:用元素列表或文本

<property> 
    <value>Some text</value> 
</property> 

<property> 
    <value> 
     <item id="first_id"/> 
     <item id="second_id"/> 
     <item id="third_id"/> 
    </value> 
</property> 

我怎樣才能做到這一點與Java?

我創建了一個類:

@Root(strict = false) 
public class PropertyValue { 
    @ElementList(inline = true, required = false) 
    private List<ItemData> items; 

    @Text(required = false) 
    private String text; 
} 

ItemDataitem類。

但這不起作用。 該代碼給我一個例外:

org.simpleframework.xml.core.TextException: Text annotation @org.simpleframework.xml.Text(data=false, empty=, required=false) on field 'text' private java.lang.String PropertyValue.text used with elements in class PropertyValue 

回答

1

我解決了這個問題!

我用了以下問題的答案:Deserializing an XML tag with text AND subtags using Retrofit

我創建的,因爲我想(我的代碼:-(抱歉)轉換XML文件類:

public class PropertyValueConverter implements Converter<PropertyValue> { 
    @Override 
    public PropertyValue read(InputNode node) throws Exception { 
     PropertyValue propertyValue = new PropertyValue(); 
     List<ItemData> propertyValueItems = new ArrayList<>(); 
     String propertyValueText = ""; 

     InputNode itemNode = node.getNext("item"); 
     while (itemNode != null) { 
      String itemId = itemNode.getAttribute("id").getValue(); 
      ItemData itemData = new ItemData(); 
      itemData.setId(itemId); 
      propertyValueItems.add(itemData); 
      itemNode = node.getNext("id"); 
     } 

     if (propertyValueItems.size() == 0) { 
      propertyValueText = node.getValue(); 
     } 

     propertyValue.setItems(propertyValueItems); 
     propertyValue.setText(propertyValueText); 

     return propertyValue; 
    } 

    @Override 
    public void write(OutputNode node, PropertyValue value) throws Exception { 

    } 
} 

然後,我改變PropertyValue類:

@Root(strict = false) 
@Convert(value = PropertyValueConverter.class) 
public class PropertyValue { 
    private List<ItemData> items; 

    private String text; 

    public List<ItemData> getItems() { 
     return items; 
    } 

    public void setItems(List<ItemData> items) { 
     this.items = items; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 
} 

然後我設置SimpleXML的轉換器廠:

private static Strategy strategy = new AnnotationStrategy(); 
private static Serializer serializer = new Persister(strategy); 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(API_BASE_URL) 
       .addConverterFactory(SimpleXmlConverterFactory.create(serializer)); 

所以,它適用於我。

3

我做到了用元素列表和入門

@ElementList(entry = "item", inline = true)

作品對我來說沒有自定義轉換器。 全班級:

@Root(name = "property") 
public class Property { 
    @ElementList(entry = "item", inline = true, required = false) 
    private List<Item> items; 

    @Text(required = false) 
    private String text; 
}