XML как источник данных для дерева Vaadin - PullRequest
4 голосов
/ 11 ноября 2011

есть небольшой проект, над которым я работаю, в этом проекте мне нужно отобразить некоторые данные из источника / файла XML в дереве Vaadin.

Мой вопрос: могу ли я сделать это с ваадиновым деревом и насколько трудно это реализовать?

Я посмотрел на демонстрационные деревья Vaadin, в которых все они используют контейнеры в качестве источника, поэтому не знаю, будет ли он работать с XML.

Я новичок в XML и Java, поэтому не стесняюсь публиковать некоторые полезные руководства / ссылки

1 Ответ

8 голосов
/ 11 ноября 2011

Существует, вероятно, много java-библиотек для обработки xml. Просто возьмите один, например, XOM, и преобразуйте его в HierarchicalContainer.

Например, взяв пример чтения XML, найденный здесь: http://bethecoder.com/applications/tutorials/xml-xom-read-xml.html и преобразовав его в IndexedContainer:

<?xml version="1.0"?>
<students>
    <student>
        <name>Sriram</name>
        <age>2</age>
    </student>
    <student>
        <name>Venkat</name>
        <age>29</age>
    </student>
    <student>
        <name>Anu</name>
        <age>28</age>
    </student>      
</students>

Теперь мы можем изменить код и выбросить данные в контейнер:

Builder builder = new Builder();
InputStream ins = ReadXML.class.getClassLoader()
      .getResourceAsStream("student_list.xml");

//Reads and parses the XML
Document doc = builder.build(ins);
Element root = doc.getRootElement();

IndexedContainer container = new IndexedContainer();
container.addContainerProperty("name", String.class, null);
container.addContainerProperty("age", Integer.class, null);
//Get children
Elements students = root.getChildElements();
for (int i = 0 ; i < students.size() ; i ++) {
  System.out.println(" Child : " + students.get(i).getLocalName());
  Object student = container.addItem();
  Item studentItem = container.getItem(student);

  //Get first child with tag name as 'name'
  Element nameChild = students.get(i).getFirstChildElement("name");
  if (nameChild != null) {
    studentItem.getItemProperty("name").setValue(nameChild.getValue());
  }
  Element ageChild = students.get(i).getFirstChildElement("age");
  if (ageChild != null) {
      studentItem.getItemProperty("age").setValue(ageChild.getValue());
  }
}

теперь этот индексированный контейнер можно подключить к таблице или дереву. Вы можете изменить его на HierarchicalContainer, если у вас есть формат дерева в вашем xml, и вы используете setParent для контейнера. Если вы хотите показать несколько свойств, вам нужно использовать TreeTable вместо Tree, поскольку Tree показывает только одно свойство.

...