gpt4 book ai didi

java - 将元素从一个 XML 文件复制并重命名为 Java 中的另一个 XML 文件

转载 作者:行者123 更新时间:2023-11-30 11:57:09 24 4
gpt4 key购买 nike

我可以使用 “org.w3c.dom.Document.importNode(Node importedNode, boolean deep)”将一个节点从一个 XML 文件复制到另一个文件中
但是,我似乎无法重命名正在复制的元素。

我有这样的东西:
File1.xml

<SomeCustomNode randomAttribute="aValue" another="10/10/2010">  
<Information>
<Yellow name="banana"/>
<Orange name="orange"/>
<Red name="strawberry"/>
</Information>
<Some>
<IgnoredNode/>
</Some>
</SomeCustomNode>

还有这样的东西:
文件列表.xml

<ListOfNodes date="12/10/2010">  
<aCopy name="fruit" version="10">
<Yellow name="banana"/>
<Orange name="orange"/>
<Red name="strawberry"/>
</aCopy>
<aCopy name="vegetables" version="3">
<Yellow name="sweetcorn"/>
<Orange name="carrot"/>
<Red name="tomato"/>
</aCopy>
</ListOfNodes>

所以,我正在做的是从 File1.xml 中取出一个节点(和子节点)并将其插入到 FileList.xml 中,但重命名 Element 并向元素添加几个属性。
信息变成aCopy name="fruit"version="10"

我目前正在使用 XPath 表达式将 Information 节点获取为 NodeList(只有 1 个结果),然后将其导入到 File2 中,如下所示:

Document docFile1 = XMLDocumentStore.getDoc("/path/to/File1.xml");  
Document docFileList = XMLDocumentStore.getDoc("/path/to/FileList.xml");
NodeList result = XPathAPI.selectNodeList(docFile1.getFirstChild(), ".//Information");
Node importNode = docFileList.importNode(result.item(0), true);
// We want to replace aCopy fruit with the updated version found in File1
NodeList fruitNode = XPathAPI.selectNodeList(docFileList.getFirstChild(), ".//aCopy[@name=\"fruit\"]");
Node replaceNode = fruitNode.item(0).getParentNode().replaceChild(importNode, fruitNode.item(0)); // probably a better way to do this
// Now we want to replace the Element name as it is still set to Information
docFileList.renameNode(replaceNode, null, "aCopy"); // Error: oracle.xml.parser.v2.XMLDOMException: cannot add attribute belonging to another element

如果我稍微移动代码,我会遇到其他错误,例如: 不能删除或替换不是当前节点的子节点的节点

通过 XSLT 会更好吗?我所做的只是获取一个特定节点(及其子节点)并将其放入另一个 XML 文件中,但替换元素名称并添加 2 个属性(带有值)。对于每个文件 (File1 ... File###) 它将是相同的节点,并且将以相同的方式重命名,属性值取自源文件(例如我的示例中的 File1.xml)和子 -节点不会更改(在我的示例中为黄色、橙色、红色)。
干杯!

最佳答案

为什么要使用 Oracle XML 解析器?

如果您使用 javax.xml 提供的默认值,您将不会收到此错误:

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sun.org.apache.xpath.internal.XPathAPI;

public static void main(String[] args) throws Exception {

Document docFile1 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("File1.xml"));
Document docFileList = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("FileList.xml"));
NodeList result = XPathAPI.selectNodeList(docFile1.getFirstChild(), ".//Information");
Node importNode = docFileList.importNode(result.item(0), true);
// We want to replace aCopy fruit with the updated version found in File1
NodeList fruitNode = XPathAPI.selectNodeList(docFileList.getFirstChild(), ".//aCopy[@name=\"fruit\"]");
Node replaceNode = fruitNode.item(0).getParentNode().replaceChild(importNode, fruitNode.item(0)); // probably a better way to do this
// Now we want to replace the Element name as it is still set to Information
docFileList.renameNode(replaceNode, null, "aCopy");

print(docFileList);

}

打印出来:

<ListOfNodes date="12/10/2010">  
<Information>
<Yellow name="banana"/>
<Orange name="orange"/>
<Red name="strawberry"/>
</Information>
<aCopy name="vegetables" version="3">
<Yellow name="sweetcorn"/>
<Orange name="carrot"/>
<Red name="tomato"/>
</aCopy>
</ListOfNodes>

关于java - 将元素从一个 XML 文件复制并重命名为 Java 中的另一个 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com