2016-03-11 7 views
2

Если существует XML-файл, как это:Читайте неизвестные элементы из XML

<List> 
    <ListItem> 
     <Element1>foo</Element1> 
    </ListItem> 
    <ListItem> 
     <Element2>another foo</Element2> 
    </ListItem> 
    <ListItem> 
     <Element3>foo foo</Element3> 
    </ListItem> 
    <ListItem> 
     <Element4>foooo</Element4> 
    </ListItem> 
    <ListItem> 
     <Element5>foo five</Element5> 
    </ListItem> 
</List> 

Как я могу прочитать элементы, имена которых всегда разные? <ListItem> тег всегда одинакова, но элементы всегда имеют разные имена ..

Я застрял в этой точке:

@Root(name = "ListItem") 
public class ListItem 
{ 
    @Element(name = ?????) 
    String Element; 
} 

И в конце концов, я хочу, чтобы использовать его как это:

... 

    @ElementList(name = "List") 
    List<ListItem> Items; 

... 

с уважением

+0

Посетите страницу https://stackoverflow.com/que stions/28093837/парсер к разбору-неизвестно-XML-схема-в-Java/46217892 # 46217892 –

ответ

0

Если элементы варьируются так много, вам придется сделать некоторые работы вручную - однако, это не так много:

  1. Внесите a Converter, например. ListItemConverter
  2. Включить его @Convert аннотацию
  3. Набор AnnotationStrategy для Serializer

@Root(name = "List") 
public class ExampleList 
{ 
    @ElementList(inline = true) 
    private List<ListItem> elements; 

    /* ... */ 


    @Root(name = "ListItem") 
    @Convert(ListItemConverter.class) 
    public static class ListItem 
    { 
     private final String text; 


     public ListItem(String text) 
     { 
      this.text = text; 
     } 

     /* ... */ 
    } 

    static class ListItemConverter implements Converter<ListItem> 
    { 
     @Override 
     public ListItem read(InputNode node) throws Exception 
     { 
      final InputNode child = node.getNext(); 

      if(child != null) 
      { 
       /* 
       * If you need the 'Element*' too: 
       * child.getName() 
       */ 
       return new ListItem(child.getValue()); 
      } 

      return null; 
     } 


     @Override 
     public void write(OutputNode node, ListItem value) throws Exception 
     { 
      // Implement if you also need to write ListItem's 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 
    } 

} 

Не забудьте установить AnnotationStrategy, иначе не будет работать @Convert:

Serializer ser = new Persister(new AnnotationStrategy()); 
// ... 
Смежные вопросы