XML附加 - Java

时间:2017-11-10 19:20:26

标签: java xml

我有以下代码附加到xml文件。问题是它每次与主元素一起附加时都包含xml配置行。它适用于添加到文件的第一条记录,因为之前没有现有元素。如何修改此代码以排除具有现有元素的现有文件的那些行?

import java.io.FileWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.xml.sax.SAXException;
public class WriteXMLFile {

public static void main() throws ParserConfigurationException,SAXException,Exception{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();//
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();//

Document doc = docBuilder.newDocument();// this is difrent

Element rootElement = doc.createElement("Contacts");//
doc.appendChild(rootElement); // this is difrent

Element Contact1 = doc.createElement("Contact1");
rootElement.appendChild(Contact1);


Contact1.setAttribute("id","1");

Element firstname = doc.createElement("Name");
firstname.appendChild(doc.createTextNode(EmailFrame.name.getText()));
Contact1.appendChild(firstname); 

//Email Element
Element email = doc.createElement("Email");
email.appendChild(doc.createTextNode(EmailFrame.email.getText()));
Contact1.appendChild(email); 

// phone element
Element phone= doc.createElement("Phone");
phone.appendChild(doc.createTextNode(EmailFrame.phone.getText()));
Contact1.appendChild(phone);

//id element
Element id = doc.createElement("ID");
id.appendChild(doc.createTextNode(EmailFrame.id.getText()));
Contact1.appendChild(id); 

try{
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);


StreamResult result = new StreamResult(new FileWriter("C:/Users/steve/Desktop/xmlemail/Email.xml",true));

transformer.transform(source, result);
System.out.println("File saved!");

}
catch (TransformerException tfe) {
tfe.printStackTrace();
}
}}

1 个答案:

答案 0 :(得分:1)

  1. 如果您正在寻找“覆盖”该文件,那么您应该使用
  2. StreamResult result = new StreamResult(new FileWriter("D:/tmp/Email.xml"));,因为boolean parameter只是附加到文档中。

    1. 如果你确实想要追加但不想要<?xml version="1.0" encoding="UTF-8" standalone="no"?>那么你必须“读取”该文件,获取根节点,然后将元素添加到根节点。
    2. 请记住,如果您继续向文档添加节点而不是根元素,那么即使没有<?xml version="1.0" encoding="UTF-8" standalone="no"?>,您的xml也将无效,因为它将包含多个根元素“contacts”。

      类似的东西:

          Document doc = null;
          Node rootElement = null;
          if (f.exists()) {
              doc = docBuilder.parse("C:/Users/steve/Desktop/xmlemail/Email.xml");
              rootElement = doc.getFirstChild();//
      
          } else {
              doc = docBuilder.newDocument();// this is difrent
              rootElement = doc.createElement("Contacts");//
              doc.appendChild(rootElement); // this is difrent
          }
      

      然后将文档保存到文件而不附加。