java - append 到 XML 文件

标签 java xml append document

我正在编写一个 Java 应用程序,其中包含将数据保存到 XML 的方法。

这是我的代码:

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.newDocument();
    Element rootElement = doc.createElement("Weather");
    doc.appendChild(rootElement);

    Element weatherElement = doc.createElement(strCity);
    rootElement.appendChild(weatherElement);

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

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

方法调用:

SaveToXML("Auckland", "24-05-2013", "Fine", "10", "Test.xml");

这是输出 XML 数据:

<?xml version="1.0" encoding="UTF-8"?>
<Weather>
    <Auckland>
        <Date id="24-05-2013">
            <forecast>Fine</forecast>
            <mindegrees>10</mindegrees>
        </Date>
    </Auckland>
</Weather>

请帮助我修改代码,以便在调用该方法时将数据 append 到文档中的正确元素中。

例如,如果奥克兰市第二次调用该方法,则天气详细信息将放置在奥克兰元素中。如果将城市作为文档中尚不存在的参数传递,则将为该城市创建一个新元素。

更新2

这是我当前执行错误的代码:

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    //Document doc = docBuilder.newDocument();
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(FileName));
    Element rootElement = doc.createElement("Weather");
    doc.appendChild(rootElement);

    NodeList weatherNodes = rootElement.getElementsByTagName(strCity);// do we already have node?
    Element weatherElement;
      if(weatherNodes.getLength() > 0){                     // if so reuse
        weatherElement = (Element) weatherNodes.item(0);
        System.out.println("Found");
    }else {                                               // else create
        weatherElement = doc.createElement(strCity);
        rootElement.appendChild(weatherElement);    
    }

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}        

上面的代码在运行时生成此错误:

[Fatal Error] Test.xml:1:177: The markup in the document following the root element must be well-formed. org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.

更新3

这是正在运行的代码:

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc;
    File file = new File(FileName);
    if (!file.exists()) {
        doc = docBuilder.newDocument();
        doc.appendChild(doc.createElement("Weather"));
    } else {
        doc = docBuilder.parse(new File(FileName));
    }

    Element rootElement = doc.getDocumentElement();
    Element weatherElement;
    NodeList weatherNodes = doc.getDocumentElement().getElementsByTagName(strCity);
    if (weatherNodes.getLength() > 0) {
        weatherElement = (Element) weatherNodes.item(0);
    } else {
        weatherElement = doc.createElement(strCity);
        rootElement.appendChild(weatherElement); 
    }

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}       

最佳答案

要修改更新 DOM 文档结构的方式,

修改

Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Weather");
doc.appendChild(rootElement);

Element weatherElement = doc.createElement(strCity);
rootElement.appendChild(weatherElement);

Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Weather");
doc.appendChild(rootElement);

  NodeList weatherNodes = rootElement.getElementsByTagName(strCity);// do we already have node?
  Element weatherElement;
  if(weatherNodes.getLength() > 0){                     // if so reuse
    weatherElement = (Element) weatherNodes.item(0);
}else {                                               // else create
    weatherElement = doc.createElement(strCity);
    rootElement.appendChild(weatherElement);    
}

请注意,如果文档会变得非常大,那么 DOM 确实适用于小文档 你需要看看像 STaX 这样的东西。

关于java - append 到 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16726355/

相关文章:

php - 如何使用 ob_start append 到文件

java - 为什么hibernate删除操作不起作用?

xml - 在 XML 中,如何/为什么可以在定义 namespace 之前使用它?

java - exec-maven-plugin 找不到或加载主类但输出在命令行上运行正常

c# - 在 SQL Server 中插入时,如何处理数据表中的 NULL 值变成丢失的 XML 元素?

arrays - slice append 的行为异常

Python 列表元素模式

Java数组逆序排序!需要反向反转

java - 使用java将记录插入mysql

java - 没有名为 testPU 的 EntityManager 的持久性提供程序