java - 在java中编辑XML文件

标签 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;
}

最佳答案

不要自己读写 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));

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

相关文章:

Java XML 解析器 block (非常不寻常和奇怪!)

ruby-on-rails - rails : "new or edit" path helper?

java - 输入正确的值后程序不会退出循环

java - 如何在 Apache 反向代理后面的子目录上设置 Play?

java - 了解用于 Java 转换的部分 C 代码

json - JQ:如何根据正则表达式匹配替换键和值?

javascript - 从 contentEditable div 的容器中获取样式

java - Apache CXF 文档功能

java - 使用 JAXB 解码 XML 时出现 ClassCastException

mysql - 我将 MYSQL 与 EXTRACTVALUE 命令一起使用,并且在使用 [@attribute ="value"] 过滤器时,以下查询返回 BLANK。为什么?