XML和树,行走出树

时间:2017-06-01 13:14:05

标签: java xml tree nodes

我想用框架Vaadin将我的XML文件转换为Java树。但是有了一行就把它拿出来了,我不明白为什么,要理解我做了一个XML:

<overlay>
    <type>bgp</type>
    <bgp>
        <bgp-asn>12</bgp-asn>
    </bgp>
</overlay>
<overlay-routing>
    <type>test</type>
    <b>
        <bgp-as>11</bgp-as>
    </b>
</overlay-routing>

结果如下: tree

所以你可以看到我只是用XML更改了我的行的名称并且它有效,但是使用“bgp-asn”它不起作用,我真的不明白。这是XML的关键工作?或类似的东西 ? 我可以把我的代码:

private Component test(){
        VerticalLayout ver = new VerticalLayout();
        ver.setSizeFull();
        TextArea text = new TextArea();
        Button send = new Button("send");
        tre = new Tree();
        tre.setSizeFull();

        send.addClickListener(new ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                if(text.isEmpty()){
                    return;
                }
                Node node = getData(text.getValue());
                loadTree(tre, null, node);
            }
        });

private Document getData(String data){
        data = "<capsule>" + data;
        data = data + "</capsule>";
        try {
            if(data == null){
                return null;
            } else {
                try{
                    builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                } catch (ParserConfigurationException e){
                    throw new RuntimeException("cannot create a data source", e);
                }
                return builder.parse(new ByteArrayInputStream(data.trim().getBytes("UTF-8")));
            }
            //return data == null ? null : builder.parse(new ByteArrayInputStream(data.trim().getBytes("UTF-8")));
        } catch (SAXException | IOException e) {
            throw new RuntimeException("cannot load data from content", e);
        }
    }

和loadtree:

private void loadTree(Tree tree, Object parentID, Node element){

        if(tree == null || element == null){
            return;
        }
        final String itemID = (element.getNodeType() == Node.TEXT_NODE ? element.getNodeValue() : element.getNodeName()).trim();

        if(itemID.length() == 0){
            return;
        }
        tree.addItem(itemID);

        if(parentID != null){
            tree.setParent(itemID, parentID);
        }
        NodeList children = element.getChildNodes();
        System.out.println(parentID);
        for(int i = 0, n = children.getLength(); i < n; i++){

            loadTree(tree, itemID, children.item(i));
        }
        if(children.getLength() > 0){
            tree.expandItem(itemID);
        } else{
            tree.setChildrenAllowed(itemID, false);
        }
    }

如果你知道什么是错的,它会很棒! 谢谢 !

1 个答案:

答案 0 :(得分:0)

好的,我现在知道了,像bgp和标签&lt; BGP&GT;我的代码没有什么区别。我必须添加2行才能使其正确。这里是函数loadtree()的好部分

private void loadTree(Tree tree, Object parentID, Node element){

        if(tree == null || element == null){
            return;
        }

        final String itemID = (element.getNodeType() == Node.TEXT_NODE ? element.getNodeValue() : element.getNodeName()).trim();

        if (itemID.equals("#document")) {
            loadTree(tree, null, element.getChildNodes().item(0));
            return;
        }

        if(itemID.length() == 0){
            return;
        }
//add this two lines
        Object item = tree.addItem();
        tree.setItemCaption(item, itemID);

        if(parentID != null){
            tree.setParent(item, parentID);
        }

        NodeList children = element.getChildNodes();
        for(int i = 0, n = children.getLength(); i < n; i++){

            loadTree(tree, item, children.item(i));
        }

        if(itemID.equals("root")){
            tree.expandItem(item);
        }

        if(children.getLength() == 0){
            tree.setChildrenAllowed(item, false);
        }
    }

现在它很完美! 谢谢。