我想用框架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>
所以你可以看到我只是用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);
}
}
如果你知道什么是错的,它会很棒! 谢谢 !
答案 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);
}
}
现在它很完美! 谢谢。