2012-05-17 26 views
1

我尝试一般的树(无限的子节点)副转换为一个名为“pays.xml”像这样的XML文件:转换通用树二叉树 - XML解析器

<?xml version="1.0" encoding="iso-8859-1"?> 
<country> 
    <name> </name> 
    <city> </city> 
    <region> 
     <name> </name> 
     <population> </population> 
     <city> Lille </city> 
    </region> 
    <region> 
    </region> 
</country> 

树副教授这个XML文件: enter image description here

现在我想这棵树转换为二叉树,IM aplying的算法为:

  • 使用的根一般树作为二叉树的根

  • 确定根的第一个孩子。这是 通用树中最左边的节点

  • 插入此节点。父节点的子引用是指这个 节点

  • 继续寻找每一父节点的第一个孩子,并与父母的孩子参考这个节点插入下面 父节点。

所以结果是:

enter image description here

所以我的问题是生成的XML文件相关联的二叉树,结果我想拥有的是:

<country> 
     <name> 
      <city> 
       <region> 
        <name> 
         <population> 
           <city> 

           </city> 
         </population> 
        </name> 
        <region></region> 
       </region> 
      </city> 
     </name> 
    </country> 

我试图写一个代码,但不幸的是,我有这个结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?><country><name/><city/><region><name/><population/><city/></region><region><name/><city/><city/></region></country> 

这里是我的代码:

public static Document Generer (Document doc, Node node,Node a) 
    { 

     NodeList nl = node.getChildNodes(); 

     for (int i = 0; i < nl.getLength(); i++) { 
      Node n = nl.item(i); 
      if (n instanceof Element) 
      { 
       Element b = doc.createElement(n.getNodeName()); 
       //System.out.print(b); 
       a.appendChild(b); 
       Generer (doc,n,b); 

      } 
     } 
    return doc; 
} 


public static void convert (Node node) 
{ 
    try { 

      DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

      // root elements 
      Document doc = docBuilder.newDocument(); 
      Element a=doc.createElement(node.getNodeName()); 
      doc.appendChild(a); 
      doc=Generer (doc, node ,a); 
      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      //StreamResult result = new StreamResult(new File("C:\\file.xml")); 

      // Output to console for testing 
      StreamResult result = new StreamResult(System.out); 

      transformer.transform(source, result); 


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


public static Node GetNodeParent (String fichier1) 
{ 
    try{ 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder parser = factory.newDocumentBuilder(); 
     Document doc = parser.parse(fichier1); 
     Element root = doc.getDocumentElement(); 
     return root; 

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

} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Node n1= GetNodeParent("pays.xml"); 
    //System.out.println(n1); 
    convert(n1); 

} 

回答

1

您提供的代码做完全地不同的事,如果你仔细看你的循环:

NodeList nl = node.getChildNodes(); 

    for (int i = 0; i < nl.getLength(); i++) { 
     Node n = nl.item(i); 
     if (n instanceof Element) 
     { 
      Element b = doc.createElement(n.getNodeName()); 
      //System.out.print(b); 
      a.appendChild(b); 
      Generer (doc,n,b); 

     } 
    } 

您可能会注意到“节点的所有子“变量将被添加到”a“元素。所以你只需要复制掉所有不是元素节点的完整树(例如,这会导致格式化丢失)。

+0

没错!有什么建议? –

+1

您应该在添加子项后将a更改为b,如下所示: “a.appendChild(b); a = b;”。它会强制算法添加根元素的第2个子元素作为第2个元素(或者可能是第一个依赖树)的第1个根子元素的子元素(有点质量)。尝试,它应该工作。 – Dmitry