Java 将通用树转换为二叉树XML解析器

Java 将通用树转换为二叉树XML解析器,java,xml,dom,data-structures,xml-parsing,Java,Xml,Dom,Data Structures,Xml Parsing,我正在尝试将常规树(无限子节点)关联转换为名为“pays.XML”的XML文件,如下所示: <?xml version="1.0" encoding="iso-8859-1"?> <country> <name> </name> <city> </city> <region> <name> </name> <p

我正在尝试将常规树(无限子节点)关联转换为名为“pays.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文件关联的树:

现在我想把这棵树转换成一棵二叉树,我正在使用一种算法:

  • 使用常规树的根作为二叉树的根

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

  • 插入此节点。父节点的子引用引用此 节点

  • 继续查找每个父节点的第一个子节点并将其插入下面 具有父节点对此节点的子引用的父节点

因此,结果是:

因此,我的问题是生成与二叉树关联的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);

}
公共静态文档生成器(文档文档、节点、节点a)
{
NodeList nl=node.getChildNodes();
对于(int i=0;i
如果仔细查看循环,您提供的代码会做完全不同的事情:

    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);

       }
    }
NodeList nl=node.getChildNodes();
对于(int i=0;i

您可能会注意到,“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);

       }
    }
NodeList nl=node.getChildNodes();
对于(int i=0;i

您可能会注意到,“node”变量的所有子元素都将添加到“a”元素中。因此,您只需复制完整的树,丢弃所有非元素节点(例如,这会导致格式错误)。

在附加子元素后,您应该将a更改为b,如:“a.appendChild(b);a=b;”。它将强制算法将根元素的第二个子元素添加为第一个根子元素的第二个子元素(或者可能是第一个依赖于树的子元素)(有点大)。试试看,它应该可以工作。在附加child之后,您应该将a更改为b,如下所示:“a.appendChild(b);a=b;”。它将强制算法将根元素的第二个子元素添加为第一个根子元素的第二个子元素(或者可能是第一个依赖于树的子元素)(有点大)。试试看,应该行得通。