当前位置: 首页 > 面试题库 >

将子节点从XML文件拆分为自己的XML文件

仲孙善
2023-03-14
问题内容

我有一个XML文件(在左侧),我想创建多个文件(在右侧):

<ParentNode>                                  file1:
    <ChildNode>                               <ParentNode>
        <node></node>                             <ChildNode>
    </childNode>                                      <node></node>
    <ChildNode>                                   </childNode>
        <node></node>                         </ParentNode>
    </childNode>                              file2:
    <ChildNode>                               <ParentNode>
        <node></node>                             <ChildNode>
    </childNode>                                      <node></node>
</ParentNode>                                      </childNode>
                                              </ParentNode>

我试图从原始XML文件中获取第一个子节点,并将其添加到新的子节点,但是在替换节点时,我一直遇到错误。

我想做类似以下的事情

 DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
 DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
 Document newDocument;

 Node firstChild = document.getFirstChild();
 NodeList childNodes = firstChild.getChildNodes();

 Element parentNode;
 for (int i = 1; i < childNodes.getLength(); i++ ) {
     newDocument = docBuilder.newDocument();
     parentNode = newDocument.createElement("ParentNode");
     newDocument.appendChild(parentNode);
     newDocument.getFirstChild().appendChild(childNodes.item(i));
 }

但我得到一个错误

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.

指出正确方向的任何帮助表示赞赏!


问题答案:

根据Java文档,

使用cloneNode方法。

摘要:

public Node cloneNode(boolean deep)

返回此节点的副本,即用作节点的通用副本构造函数。复制节点没有父节点。(parentNode为null。)。

克隆元素会复制所有属性及其值,包括XML处理器生成的代表默认属性的属性,但是此方法不会复制它包含的任何文本,除非它是深度克隆,因为该文本包含在子Text节点中。直接克隆属性(而不是作为元素克隆操作的一部分进行克隆)将返回指定的属性(指定为true)。克隆任何其他类型的节点只会返回该节点的副本。

请注意,克隆不可变的子树会导致可变的副本,但是EntityReference克隆的子级是readonly。此外,还指定了未指定Attr节点的克隆。并且,克隆Document,DocumentType,Entity和Notation节点取决于实现。

编辑:

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult;

public class Test{
 static public void main(String[] arg) throws Exception{

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder = factory.newDocumentBuilder();
 Document doc = builder.parse("foo.xml");

 TransformerFactory tranFactory = TransformerFactory.newInstance(); 
 Transformer aTransformer = tranFactory.newTransformer();


 NodeList list = doc.getFirstChild().getChildNodes();

 for (int i=0; i<list.getLength(); i++){
    Node element = list.item(i).cloneNode(true);

 if(element.hasChildNodes()){
   Source src = new DOMSource(element); 
   FileOutputStream fs=new FileOutputStream("k" + i + ".xml");
   Result dest = new StreamResult(fs);
   aTransformer.transform(src, dest);
   fs.close();
   }
   }

  }
}


 类似资料:
  • 我需要使用VTD XML和XPath读取一个大xml并在多个节点中拆分结果。我在这里找到了一些解决方案,但它拆分了节点,但没有父级信息。 我为什么要找: XPath string: /CATALOG/MAIN/CD基于XPath的文档应该拆分 1) 初始文件: <代码> 2) 结果:文件1: <代码> 文件2: <代码> 文件3: <代码> 感谢您的时间和建议。 顺致敬意,

  • 问题内容: 我有以下xml文件作为输入.... 我想将这个xml文件并通过像这样的java代码将其拆分为多个文件… File1.xml File2.xml File3.xml 以及更多的xml文件。每个xml文件最多包含10个或15个IRP_ACCOUNT。 有人能帮帮我吗 ? 问题答案: 快速而肮脏:

  • 问题内容: 我正在尝试将一个大型xml文件拆分为多个文件,并在AWK脚本中使用了以下代码。 上面的代码生成一个名称为“ fileItem_1”,“ fileItem_2”,“ fileItem3”等的xml文件列表。 但是,我希望文件名类似于“ item_XXXXX”,其中XXXXX是XML内的一个节点-如下图所示 因此,基本上我希望“ id”节点为文件名。谁能帮我这个忙吗? 问题答案: 我不会用

  • 问题内容: 我只需要此XML的HEADLINE,仅在标记之间。还必须连续不断地打印消息。我怎样才能做到这一点。 问题答案: 我将为此使用javax.xml.xpathJava SE 5中包含的API。

  • 问题内容: 我正在尝试将包含的节点另存为新文件,这是获取新文档并拆分为更小的节点列表: 输出是一个很长的列表,例如: 现在,我想将该节点另存为新的新文件,但是我没有找到按原样返回该节点的函数。谢谢。 问题答案: 您可以将节点转换为字符串,然后将此字符串保存到文件中。 将节点转换为字符串 下面的方法会将节点转换为xml字符串。这是仅JDK的解决方案,不需要依赖项。

  • 所以我有一个如下的xml文件: 并有另一个xml文件,如下所示: 使用xslt,如何将第二个文件中的两个元素添加到第一个文件中的student元素中?换句话说,如何创建如下所示的文件: 如果使用xslt是不可能的,那么使用XPath是可行的吗? 非常感谢!