gpt4 book ai didi

Java DocumentBuilder - XML 文件中的错误缩进

转载 作者:行者123 更新时间:2023-11-29 05:03:03 25 4
gpt4 key购买 nike

我尝试使用 DocumentBuilder 在 Java 中编写一个简单的 XML 文件。我希望 XML 文件看起来像这样:

<outer>
<inner>
<element name="WEB"/>
<element name="WEB"/>
<element name="WEB"/>
</inner>
</outer>

但是它是这样生成的:

<outer>
<inner>
<element name="WEB"/>
<element name="WEB"/>
<element name="WEB"/>
</inner>
</outer>

为什么第三个元素与其他两个元素的缩进不同?注意:我再次读取XML文件模拟了一个项目中的方法,读取一个XML文件,添加一个元素并保存到XML文件中。这是我的代码:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;

public class main {
private static String FILEPATH = "/tmp/xmltest.xml";
private static DocumentBuilderFactory docFactory;
private static DocumentBuilder docBuilder;
private static TransformerFactory transformerFactory;
private static Transformer transformer;

public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException, TransformerConfigurationException, TransformerException{
docFactory = DocumentBuilderFactory.newInstance();
docBuilder = docFactory.newDocumentBuilder();
transformerFactory= TransformerFactory.newInstance();
transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "1");

// Creating the XML file structure
Document document = docBuilder.newDocument();
Element rootElement = document.createElement("outer");
document.appendChild(rootElement);

Element inner = document.createElement("inner");
rootElement.appendChild(inner);

// Write XML file
write(document);

// Read XML file
document = docBuilder.parse(FILEPATH);
Element root = document.getDocumentElement();
Element innerElement = (Element)root.getElementsByTagName("inner").item(0);

// Add element
Element e = document.createElement("element");
e.setAttribute("name", "WEB");
innerElement.appendChild(e);

// Add element
e = document.createElement("element");
e.setAttribute("name", "WEB");
innerElement.appendChild(e);

// Write XML file
write(document);

// Read XML fil
document = docBuilder.parse(FILEPATH);
root = document.getDocumentElement();
innerElement = (Element)root.getElementsByTagName("inner").item(0);

// Add element
e = document.createElement("element");
e.setAttribute("name", "WEB");
innerElement.appendChild(e);

// Write XML file
write(document);
}

private static void write(Document document) throws TransformerException {
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(FILEPATH));
transformer.transform(source, result);
}
}

最佳答案

xmlfile 中用于缩进的文本节点被视为数据。因此,您的缩进将被折腾。您可以按如下方式解决此问题:

private static void removeEmptyText(Node node){
Node child = node.getFirstChild();
while(child!=null){
Node sibling = child.getNextSibling();
if(child.getNodeType()==Node.TEXT_NODE){
if(child.getTextContent().trim().isEmpty())
node.removeChild(child);
}else
removeEmptyText(child);
child = sibling;
}
}

private static void write(Document document) throws TransformerException {
removeEmptyText(document.getDocumentElement());
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(FILEPATH));
transformer.transform(source, result);
}

这里我在写入文件之前从 dom 中删除所有缩进文本节点。

关于Java DocumentBuilder - XML 文件中的错误缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31413413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com