在java中编辑XML文件

时间:2015-11-15 01:58:52

标签: java xml edit filewriter

我有以下XML文件:

<Tables>
    <table>
        <row></row>
    </table>
<Tables>

我想将其编辑为:

<Tables>
    <table>
        <row>some value</row>
    </table>
<Tables>

我使用文件编写器编写XML文件。我该如何编辑?

我发现我创建临时文件包含编辑然后删除原始文件并重命名临时文件。还有其他办法吗?

这是我编写文件的代码:

public boolean createTable(String path, String name, String[] properties) throws IOException {
    FileWriter writer = new FileWriter(path);
    writer.write("<Tables>");
    writer.write("\t<" + name + ">");
    for(int i=0; i<properties.length; i++){
        writer.write("\t\t<" + properties[0] + "></" + properties[0] + ">");
    }
    writer.write("\t</" + name + ">");
    writer.write("</Tables>");
    writer.close();
    return false;
}

3 个答案:

答案 0 :(得分:4)

不要自己读写XML。 Java附带了多个用于解析和生成XML的API,它可以为您处理所有编码和转义问题:

  • DOM XML以树形结构加载到内存中。
  • SAX XML作为一系列事件处理。这是一个推送解析器,解析器会为每个事件调用您的代码。
  • StAX XML被读作一系列事件/令牌。这是一个拉解析器,您的代码会调用解析器来获取下一个值。

您还可以找到许多用于解析XML的第三方库,Java本身也支持将XML编组到POJO。

在您的情况下,我建议使用DOM,因为它最容易使用。不要将DOM用于大型XML文件,因为它会将整个文件加载到内存中。对于大文件,我建议使用StAX。

除了编码问题之外,使用XML解析器将使代码不易受输入中的微小变化的影响,例如:下面3个空的row元素都意味着相同。或者row元素是否为空,以及如何摆脱现有内容,如下所示:

<!-- row is empty -->
<row></row>
<row/>
<row />

<!-- row has content -->
<row>5 + 7 &lt; 10</row>
<row><![CDATA[5 + 7 < 10]]></row>
<row><condition expr="5 + 7 &lt; 10"></row>

使用DOM:

// Load XML from file
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
Document document = domBuilder.parse(file);

// Modify DOM tree (simple version)
NodeList rowNodes = document.getElementsByTagName("row");
for (int i = 0; i < rowNodes.getLength(); i++) {
    Node rowNode = rowNodes.item(i);

    // Remove existing content (if any)
    while (rowNode.getFirstChild() != null)
        rowNode.removeChild(rowNode.getFirstChild());

    // Add text content
    rowNode.appendChild(document.createTextNode("some value"));
}

// Save XML to file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(document),
                      new StreamResult(file));

答案 1 :(得分:1)

如果你的xml是静态的,你可以使用它,这里input.xml是你的xml文件

File file = new File("input.xml");
byte[] data;
try (FileInputStream fis = new FileInputStream(file)) {
   data = new byte[(int) file.length()];
    fis.read(data);
}
String input = new String(data, "UTF-8");
String tag = "<row>";
String newXML = input.substring(0, input.indexOf(tag) + tag.length()) + "your value" + input.substring(input.indexOf(tag) + tag.length(), input.length());
try (FileWriter fw = new FileWriter(file)) {
    fw.write(newXML);
}
System.out.println("XML Updated");

答案 2 :(得分:0)

Underscore-java库可以读取和修改xml文件。 Live example

import com.github.underscore.lodash.U;

public class MyClass {
    public static void main(String args[]) {
        String xml = "<Tables>"
        + "    <table>"
        + "        <row></row>"
        + "    </table>"
        + "</Tables>";  
        java.util.Map<String, Object> object = (java.util.Map<String, Object>) U.fromXml(xml);
        U.set(object, "Tables.table.row", "some value");
        System.out.println(U.toXml(object)); 
    }
}

// <Tables>
//  <table>
//    <row>some value</row>
//  </table>
//</Tables>