2012-03-13 128 views
1

如何将相同的元素添加为子元素。我想是这样的:将XML添加为子元素的相同元素(获取HIERARCHY_REQUEST_ERR)

<family> 
    <parent name = "P1"> 
    <child name = "P1C1"> 
     <child name = "P1C1C1"/> 
     <child name = "P1C1C2"/> 
    </child> 
    <child name = "P1C2"/> 
    <child name = "P1C3"> 
     <child name = "P1C3C1"/> 
    </child> 
    </parent> 
    <parent name = "P2"> 
    <child name = "P2C1"> 
     <child name = "P2C1C1"/> 
    </child> 
    <child name = "P2C2"> 
     <child name = "P2C2C1"/> 
    </child> 
    </parent> 
</family> 

如果我试图创建一个子元素,并添加另一个孩子吧,我得到:

HIERARCHY_REQUEST_ERR:试图插入其中,这是不允许的节点。

我们如何生成上面的XML树?

也看到了解决的大局观我建立: Generate XML mapping of a recursive directory search

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 


public class ChildofChildXML { 

    public static void main(String[] args) { 
     try { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
      Document doc = docBuilder.newDocument(); 
      Element root = doc.createElement("family"); 
      doc.appendChild(root); 

      Element parent = doc.createElement("parent"); 
      parent.setAttribute("name","P1"); 
      root.appendChild(parent); 

      Element childElement = doc.createElement("child"); 
      childElement.setAttribute("name","P1C1"); 
      parent.appendChild(childElement); 


      Element childElement2 = doc.createElement("child"); //Works 
      childElement2.setAttribute("name","P1C1C1"); 
      childElement.appendChild(childElement2); 

      /* 
      childElement = doc.createElement("child"); 
      childElement.setAttribute("name","P1C1C1"); 

      // Not allowed - HIERARCHY_REQUEST_ERR: 
      childElement.appendChild(childElement); 
      */ 

      childElement = doc.createElement("child"); 
      childElement.setAttribute("name","P1C2"); 
      parent.appendChild(childElement); 

      TransformerFactory tranFactory = TransformerFactory.newInstance(); 
      Transformer aTransformer = tranFactory.newTransformer(); 
      aTransformer.setOutputProperty("indent", "yes"); 

      Source src = new DOMSource(doc); 
      Result dest = new StreamResult(System.out); 
      aTransformer.transform(src, dest); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

现在的代码需要用递归“扩大档案”称,这是在那里我想知道如何添加合并因为我需要将解决方案应用于递归 - 我正在使用java.util.zip扩展顶级归档文件。这里相当于包含作为父级的顶级归档的文件夹,后续节点与递归归档的内容相同。所以耳朵可能会有战争或罐子。这场战争可能在它下面有jsp,并且WEB-INF/lib/x.jar和WEB-INF/lib/x.jar需要再次扩展等等,并且这个child - > child - > child关系是由父母建立。

+1

请显示失败的代码...并且这是在特定的DTD中吗? – 2012-03-13 06:33:28

+0

我已经添加了一个简单的代码,也是一个链接的要求更大的图片。 – rommel 2012-03-13 13:11:48

回答

1

您可以将一个<child>节点作为子节点添加到<parent>和其他<child>节点。不允许将其添加到<family>或直接添加到文档中。 (粗略的估计 - 我需要看到的模式或DTD)


二 - 如果你为一个文件创建元素,一直使用此模式:

Element element = doc.createElement("child"); 
+0

我已经添加了更多的细节,请看看。谢谢。 – rommel 2012-03-13 13:12:42

+0

Hi @Andreas_D - 我在回复Jon Skeet在发布元素引用heirarchy时发布的问题详细信息,同时对查找子节点的相同函数进行递归调用,并且需要将父节点映射到子节点,所有相同的元素名称。 – rommel 2012-03-21 11:43:36

4

这就是问题:

childElement.appendChild(childElement); 

您正在尝试向其自身添加子元素。你不能那样做。这样做没有任何意义......一个元素不能成为它自己的孩子。您如何期望在最终的XML中代表?

如果更改代码

parent.appendChild(childElement); 

childElement2.appendChild(childElement); 

然后它的罚款。

+0

嗨@Jon Skeet - 我正在寻找最好的方法来处理子目录的目录的递归查找并将每个目录的内容映射到父目录,并且父目录和子目录将具有相同的元素名称。内容可以是另一个子目录和文件。当遇到一个子目录时,它应该被映射到它的父目录,并且递归方法调用应该知道父目录元素。递归查找正在失去对父节点的跟踪,并且在递归地映射所有子节点之前不得关闭。 – rommel 2012-03-21 11:38:25