Отображение более сложного XML в GXT Grid с использованием XmlReader - PullRequest
1 голос
/ 29 ноября 2011

У меня есть ответ XML, который я хотел бы привязать и отобразить в сетке GXT.

Базовый пример, который я нашел в Интернете, говорит следующее:

    // defines the xml structure
    ModelType type = new ModelType();
    type.setRoot("records");
    type.setRecordName("record");
    type.addField("Sender", "Name");
    type.addField("Email");
    type.addField("Phone");
    type.addField("State");
    type.addField("Zip");

    // use a http proxy to get the data
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
        GWT.getHostPageBaseURL() + "data/data.xml");
    HttpProxy<String> proxy = new HttpProxy<String>(builder);

    // need a loader, proxy, and reader
    XmlLoadResultReader<ListLoadResult<ModelData>> reader = new XmlLoadResultReader<ListLoadResult<ModelData>>(
        type);

    final BaseListLoader<ListLoadResult<ModelData>> loader = new BaseListLoader<ListLoadResult<ModelData>>(
        proxy, reader);

    ListStore<ModelData> store = new ListStore<ModelData>(loader);

Это прекрасно работает, если ваш XML имеет простую структуру (т.е. не содержит вложенных элементов).

Однако мой XML больше похож на это:

<myRoot>
  <myElement>
     <first>
       <time></time>
       <place></place>
     </first>
     <second>
       <time></time>
       <place></place>
     </second>
     <third>
       <time></time>
       <place></place>
     </third>
  </myElement>
  ...
</myRoot>

Как я могу представить это, используя ModelType, чтобы Grid правильно отображал результаты?

1 Ответ

1 голос
/ 21 марта 2012

Аннотация

Ключ в том, как вы анализируете XML-документ для построения ModelData (расширенный здесь как ModelType).

GXT демонстрирует, как разбирать их пример XML на bean-компоненты, и вы можете использовать ваш любимый XML-анализатор, чтобы сделать то же самое.

Вот фрагмент из их репозиториев, отредактированный на основе ваших XML-данных, чтобы продемонстрировать, как это делается:

Пример кода

Реализация сервиса (с анализатором)

public void parseXmlData() {

    try {

        // init parser / builder
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(getClass().getResourceAsStream("data.xml"));
        doc.getDocumentElement().normalize();

        // get first level
        NodeList myElementNodeList = doc.getElementsByTagName("myElement");

        // traverse first level
        for (int s = 0; s < myElementNodeList.getLength(); s++) {

            Node fstNode = myElementNodeList.item(s);
            if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

                Element fstElmnt = (Element) fstNode;
                NodeList myElementChildren = fstElmnt.getChildNodes();

                // traverse second level
                for (int c = 0; c < myElementChildren.getLength(); c++) {

                    Node cNode = myElementChildren.item(s);
                    if (cNode.getNodeType() == Node.ELEMENT_NODE) {

                        Element cElmnt = (Element) cNode;
                        NodeList timeList = cElmnt.getElementsByTagName("time");
                        NodeList placeList = cElmnt.getElementsByTagName("place");

                        // init beans
                        ModelType t = new ModelType();
                        // (scroll down to see how getValue() is implemented)
                        t.setTime(getValue(timeList, 0));
                        t.setPlace(getValue(placeList, 0));

                        // add to list
                        posts.add(t);

                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String getValue(NodeList fields, int index) {
    NodeList list = fields.item(index).getChildNodes();
    if (list.getLength() > 0) {
        return list.item(0).getNodeValue();
    } else {
        return "";
    }
}

Вы, конечно, можете расширить эту технику (продолжать проходить глубже, если хотите), чтобы соответствовать вашим потребностям.

...