2015-06-08 2 views
3

Я использую SimpleXML для анализа небольших XML-файлов, используемых в протоколе связи. Все это работает отлично, но теперь я реализую часть протокола, которая включает в себя своего рода XML свободной формы.Могу ли я использовать SimpleXML для анализа XML, структура которого неизвестна?

Например, XML, как это:

<telegram> 
    <config> 
    <foo>yes</foo> 
    <bar>no</bar> 
    </config> 
</telegram> 

Где foo и bar может измениться в будущем, или элемент baz могут быть добавлены без необходимости прикасаться код синтаксического анализа. Я хотел бы получить доступ к этим элементам на Java, используя конструкцию вроде

tree.getConfig().get("bar"); // returns "no" 

Могу ли я использовать SimpleXML для его анализа? Я просмотрел документацию, но не смог найти то, что мне нужно.

ответ

2

Могу ли я использовать SimpleXML для его анализа?

Не из коробки - но написание Converter сделает это.


@Root(name = "telegram") 
@Convert(Telegram.TelegramConverter.class) // Requires AnnotationStrategy 
public class Telegram 
{ 
    private Map<String, String> config; 


    public String get(String name) 
    { 
     return config.get(name); 
    } 

    public Map<String, String> getConfig() 
    { 
     return config; 
    } 

    // ... 

    @Override 
    public String toString() 
    { 
     return "Telegram{" + "config=" + config + '}'; 
    } 




    static class TelegramConverter implements Converter<Telegram> 
    { 
     @Override 
     public Telegram read(InputNode node) throws Exception 
     { 
      Telegram t = new Telegram(); 

      final InputNode config = node.getNext("config"); 
      t.config = new HashMap<>(); 

      // Iterate over config's child nodes and put them into the map 
      InputNode cfg = config.getNext(); 

      while(cfg != null) 
      { 
       t.config.put(cfg.getName(), cfg.getValue()); 
       cfg = config.getNext(); 
      } 

      return t; 
     } 

     @Override 
     public void write(OutputNode node, Telegram value) throws Exception 
     { 
      // Implement if you need serialization too 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 

    } 
} 

Использование:

final String xml = "<telegram>\n" 
     + " <config>\n" 
     + " <foo>yes</foo>\n" 
     + " <bar>no</bar>\n" 
     + " <baz>maybe</baz>\n" // Some "future element" 
     + " </config>\n" 
     + "</telegram>"; 
/* 
* The AnnotationStrategy is set here since it's 
* necessary for the @Convert annotation 
*/ 
Serializer ser = new Persister(new AnnotationStrategy()); 
Telegram t = ser.read(Telegram.class, xml); 

System.out.println(t); 

Результат:

Telegram{config={bar=no, foo=yes, baz=maybe}} 

 Смежные вопросы

  • Нет связанных вопросов^_^