我有一个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是可行的吗? 非常感谢!