在 java 中编辑一个 XML 文件
Edit a XML file in java
我有以下 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 是静态的,您可以使用它,这里 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");
不要自己读写 XML。 Java 附带多个 API 用于解析和生成 XML,它会为您处理所有编码和转义问题:
DOM
XML以树形结构加载到内存中。
SAX
XML 作为事件序列处理。这是一个推送解析器,解析器会为每个事件调用您的代码。
StAX
XML 被读作 events/tokens 的序列。这是一个拉式解析器,您的代码在其中调用解析器以获取下一个值。
你也可以找到很多第三方库来解析XML,Java本身也支持XML到POJO的编组。
对于您的情况,我建议 DOM,因为它最容易使用。不要对巨大的 XML 文件使用 DOM,因为它会将整个文件加载到内存中。对于大文件,我建议使用 StAX。
除了编码问题,使用 XML 解析器将使代码不易受到输入中微小变化的影响,例如下面的 3 个空 row
元素都表示相同。或者 row
元素是否为空,以及如何删除现有内容,如下所示:
<!-- row is empty -->
<row></row>
<row/>
<row />
<!-- row has content -->
<row>5 + 7 < 10</row>
<row><![CDATA[5 + 7 < 10]]></row>
<row><condition expr="5 + 7 < 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));
我有以下 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 是静态的,您可以使用它,这里 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");
不要自己读写 XML。 Java 附带多个 API 用于解析和生成 XML,它会为您处理所有编码和转义问题:
DOM
XML以树形结构加载到内存中。SAX
XML 作为事件序列处理。这是一个推送解析器,解析器会为每个事件调用您的代码。StAX
XML 被读作 events/tokens 的序列。这是一个拉式解析器,您的代码在其中调用解析器以获取下一个值。
你也可以找到很多第三方库来解析XML,Java本身也支持XML到POJO的编组。
对于您的情况,我建议 DOM,因为它最容易使用。不要对巨大的 XML 文件使用 DOM,因为它会将整个文件加载到内存中。对于大文件,我建议使用 StAX。
除了编码问题,使用 XML 解析器将使代码不易受到输入中微小变化的影响,例如下面的 3 个空 row
元素都表示相同。或者 row
元素是否为空,以及如何删除现有内容,如下所示:
<!-- row is empty -->
<row></row>
<row/>
<row />
<!-- row has content -->
<row>5 + 7 < 10</row>
<row><![CDATA[5 + 7 < 10]]></row>
<row><condition expr="5 + 7 < 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));