gpt4 book ai didi

java - 如何合并两个具有相同参数的XML文件?

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:26 25 4
gpt4 key购买 nike

我想合并两个 XML 文件(源文件和临时文件)并将结果文件放入源文件中,源文件和临时文件具有相同的元素,但具有不同的值,例如:

Source.xml:

<Main>
<source>
<param>
<entry>
<key> bla1 </key>
<value> bla1 </value>
</entry>
</param>
<Name> name1 </Name>
</Source>
</Main>

和 temp.xml:

<Main>
<source>
<param>
<entry>
<key> bla2 </key>
<value> bla2 </value>
</entry>
<entry>
<key> bla3 </key>
<value> bla3 </value>
</entry>
</param>
<Name> name2 </Name>
</Source>
</Main>

我想要的期望输出如下:

<Main>
<source>
<param>
<entry>
<key> bla1 </key>
<value> bla1 </value>
</entry>
</param>
<Name> name1 </Name>
</Source>
<source>
<param>

<entry>
<key> bla2 </key>
<value> bla2 </value>
</entry>
<entry>
<key> bla3 </key>
<value> bla3 </value>
</entry>
</param>
<Name> name2 </Name>
</Source>
</Main>

我正在使用此代码,但它根本不影响 source.xml :

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class MergeXml {

private static final String fileName = "Source.xml";
private static final String tempName = "temp.xml";
private static final String mainTag = "XmlSource";
private static final String YES = "yes";


public void mergeXML() throws ParserConfigurationException, SAXException,
IOException, TransformerException {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
Document doc = null;
Document doc2 = null;

db = dbf.newDocumentBuilder();
doc = db.parse(new File(fileName));
doc2 = db.parse(new File(tempName));
Element tag = doc.createElement(mainTag);

NodeList nodeList = doc2.getElementsByTagName("*");

for(int i =0 ; i < nodeList.getLength(); i++){

Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
String nodeName = node.getNodeName();
Element tagChild = doc.createElement((nodeName));

tag.appendChild(tagChild);
}
}

TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, YES);

DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(source, result);

BufferedWriter output = new BufferedWriter(new FileWriter(fileName));
String xmlOutput = result.getWriter().toString();
output.write(xmlOutput);
output.close();

}
}

我的 XML 原始文件(如果需要):

   <XmlSource>
<hostName>api.worldweatheronline.com</hostName>
<parameters>
<entry>
<key>num_of_days</key>
<value>1</value>
</entry>
<entry>
<key>q</key>
<value>Cairo</value>
</entry>
<entry>
<key>format</key>
<value>xml</value>
</entry>
<entry>
<key>key</key>
<value>wd63kxr294rcgvbynhaf2z4r</value>
</entry>
</parameters>
<URL>
http://api.worldweatheronline.com/free/v1/weather.ashx?q=Cairo&format=xml&num_of_days=1&key=wd63kxr294rcgvbynhaf2z4r
</URL>
<URLPath>/free/v1/weather.ashx</URLPath>

最佳答案

这是可用于合并两个 xml 的代码片段。

public static void generateDocument(Document root, Document insertDoc, String toPath, String fromPath) {

if (null != root) {



try {
Node element = getNode(insertDoc, fromPath);
Node dest = root.importNode(element, true);
Node node = getNode(root, toPath);
node.insertBefore(dest, null);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

}

}
public Node getNode(Document doc, String strXpathExpression)
throws ParserConfigurationException, SAXException, IOException,
XPathExpressionException {

XPath xpath = XPathFactory.newInstance().newXPath();

// XPath Query for showing all nodes value
XPathExpression expr = xpath.compile(strXpathExpression);

Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);

return node;
}

因此你的方法是
1、创建Soruce.xml的文档obj(obj1)
2. 创建test.xml的文档obj(obj2)并删除Main标签。

            DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc1 = builder.parse(new File("s1.xml"));
Document doc2 = builder.parse(new File("s2.xml"));
generateDocument(doc1,doc2,"/Main", "Main/source");
  1. 调用上面提到的方法generateDocument(obj1, obj2, "/Main")

关于java - 如何合并两个具有相同参数的XML文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788479/

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