2016-08-01 8 views
2

ich eine XML-Datei analysieren müssen, die zwei Typen:SimpleXML: Element mit Elementen Liste oder Text

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

und

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

Wie kann ich dies mit Java?

habe ich eine Klasse:

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

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

ItemData ist item Klasse.

Aber das funktioniert nicht. Der Code gibt mir eine Ausnahme:

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 

Antwort

1

ich das Problem gelöst!

habe ich die folgende Frage beantworten: Deserializing an XML tag with text AND subtags using Retrofit

ich eine Klasse erstellt, die die XML-Dateien zu konvertieren, wie ich (für meinen Code :-(sorry) will:

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 { 

    } 
} 

Dann änderte ich PropertyValue Klasse :

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

Dann habe ich SimpleXML-Wandler Fabrik:

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)); 

Also, es funktioniert für mich.

3

Ich tat es und Elementliste Eintrag mit

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

Werken für mich ohne individuellen Konverter. Volle Klasse:

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

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