我想合并两个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>
答案 0 :(得分:1)
以下是可用于合并两个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;
}
因此你的appraoch将是
1.创建Soruce.xml的文档obj(obj1)
2.创建test.xml的文档obj(obj2)并删除主标记。
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 :(得分:0)
是的,可以合并xml文件。您可以参考以下链接来合并您的文件。在下面的链接代码中进行必要的更改以实现XML的结构。 Merge Two XML Files in Java
答案 2 :(得分:0)
没有标记名称的XML文件合并:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
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 test {
public static void mergeXML(){
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
Document doc = null;
Document doc2 = null;
try {
db = dbf.newDocumentBuilder();
doc = db.parse(new File("f1.xml"));
doc2 = db.parse(new File("f2.xml"));
NodeList ndListFirstFile = doc.getElementsByTagName("staffs");
Node pndListFirstFile2 = doc2.getElementsByTagName("company").item(0);
NodeList pchildren = pndListFirstFile2.getChildNodes();
for(int i=0;i<pchildren.getLength();i++) {
if(pchildren.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element pelem = (Element)pchildren.item(i);
// If your document is namespace aware use localName
String plocalName = pelem.getLocalName();
// Tag name returns the localName and the namespace prefix
String ptagName= pelem.getTagName();
// do stuff with the children
System.out.print(ptagName);
Node ndListFirstFile2 = doc2.getElementsByTagName(ptagName).item(0);
NodeList children = ndListFirstFile2.getChildNodes();
for(int ii=0;ii<children.getLength();ii++) {
if(children.item(ii).getNodeType() == Node.ELEMENT_NODE) {
Element elem = (Element)children.item(ii);
// If your document is namespace aware use localName
String localName = elem.getLocalName();
// Tag name returns the localName and the namespace prefix
String tagName= elem.getTagName();
// do stuff with the children
System.out.print(tagName);
Node nodeArea = doc.importNode(doc2.getElementsByTagName(tagName).item(0), true);
ndListFirstFile.item(0).appendChild(nodeArea);
}
}
}
}
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);
Writer output = new BufferedWriter(new FileWriter("f3.xml"));
String xmlOutput = result.getWriter().toString();
output.write(xmlOutput);
output.close();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException{
mergeXML();
}
}