Разбор элементов с разными именами в виде единого списка с использованием библиотеки SIMPLE XML для Android

Мне было интересно, можно ли вообще обрабатывать col_1, col_2... и т. д. как список, а не отдельные элементы, используя SIMPLE XML Library для Android. Я немного читал о заменах, но я все еще в замешательстве.

Текущий формат:

<box-headers 
   dataTable="boxscore" 
   col_1="FINAL" 
   col_2="1" 
   col_3="2" 
   col_4="3" 
   col_5="4" 
   col_6="5" 
   col_7="6" 
   col_8="7" 
   col_9="8" 
   col_10="9" 
   col_11="R" 
   col_12="H" 
   col_13="E">
             table
 </box-headers>

Я хочу иметь возможность анализировать столбцы как какой-то список, чтобы я мог обрабатывать любое количество столбцов. Возможно ли это?


person shecodesthings    schedule 12.06.2013    source источник
comment
Попробуйте использовать org.simpleframework.xml.convert.Converter, здесь вы можете разобрать объект любой формы.   -  person ng.    schedule 13.06.2013
comment
@ollo: Спасибо за редактирование!   -  person shecodesthings    schedule 15.06.2013


Ответы (1)


Как уже говорил ng: используйте ссылку Converter для этого. Simple великолепен тем, что позволяет настраивать каждый шаг обработки (в то время как, с другой стороны, можно позволить вам (де-) сериализовать даже сложные структуры с помощью нескольких строк кода).

Итак, вот пример:

Класс, который будет содержать значения из списка:

@Root(name = "example")
@Convert(value = ListConverter.class) // Specify the Converter that's used for this class
public class Example
{
    // This element will be set with the values from 'box-headers' element
    @ElementList(name = "box-headers")
    private List<String> values;


    // This constructor is used to set the values while de-serializing
    // You can also use setters instead
    Example(List<String> values)
    {
        this.values = values;
    }

    //...
}

Converter:

public class ExampleConverter implements Converter<Example>
{
    @Override
    public Example read(InputNode node) throws Exception
    {
        List<String> list = new ArrayList<>(); // List to insert the 'col_' values

        NodeMap<InputNode> attributes = node.getAttributes(); // All attributes of the node
        Iterator<String> itr = attributes.iterator();

        while( itr.hasNext() ) // Iterate over all attributes
        {
            final String name = itr.next(); // The name of the attribute

            if( name.startsWith("col_") ) // Check if it is a 'col' attribute
            {
                // Insert the value of the 'col_' attribute
                list.add(attributes.get(name).getValue());
            }
        }

        // Return the result - instead of a constructor you can use setter(s) too
        return new Example(list); 
    }


    @Override
    public void write(OutputNode node, Example value) throws Exception
    {
        // TODO: Implement serializing here - only required if you want to serialize too
    }
}

Как использовать:

// Serializer, don't forget `AnnotationStrategy` - without it wont work
Serializer ser = new Persister(new AnnotationStrategy());

// Deserialize the object - here the XML is readen from a file, other sources are possible
Example ex = ser.read(Example.class, new File("test.xml")); 

В этом примере используются только атрибуты col_xy, все остальное отбрасывается. Если вам тоже нужны эти значения, их легко реализовать. Вам нужно только извлечь их из InputNode и установить в свой вывод.

person ollo    schedule 13.06.2013
comment
Спасибо за наглядный пример! Я определенно собираюсь попробовать это на этих выходных и скоро выберу это как правильный ответ! - person shecodesthings; 13.06.2013