You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现XML闭合标签单独换行?添加子节点时的格式调整

如何调整XML空元素的格式化输出

Python 实现方式

方法1:使用 lxml 库

lxml 默认会把空元素输出为自闭合标签,要改成起始标签和结束标签分两行的形式,给空元素加个带换行缩进的文本节点即可:

from lxml import etree

# 解析现有XML或者创建新的XML结构
root = etree.fromstring('<profile><person name="john" age="x years" job="tester"></person></profile>')
person_node = root.find('person')

# 给空节点添加匹配外层缩进的换行文本
person_node.text = '\n  '

# 输出格式化后的XML
print(etree.tostring(root, encoding='unicode', pretty_print=True))

输出结果:

<profile>
  <person name="john" age="x years" job="tester">
  </person>
</profile>

方法2:使用 xml.dom.minidom 后处理文本

如果用minidom生成格式化XML后,直接替换同一行的闭合标签:

import xml.dom.minidom

dom = xml.dom.minidom.parseString('<profile><person name="john" age="x years" job="tester"></person></profile>')
pretty_xml = dom.toprettyxml(indent='  ')

# 替换掉同一行的闭合标签为换行形式
pretty_xml = pretty_xml.replace('></person>', '>\n  </person>')
print(pretty_xml.strip())

Java 实现方式

借助Java的Transformer类开启缩进,同时给空元素添加空白文本节点实现换行:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class XmlFormatter {
    public static void main(String[] args) throws Exception {
        // 创建XML文档结构
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        Element profile = doc.createElement("profile");
        Element person = doc.createElement("person");
        person.setAttribute("name", "john");
        person.setAttribute("age", "x years");
        person.setAttribute("job", "tester");
        // 添加换行缩进的文本节点
        person.appendChild(doc.createTextNode("\n  "));
        profile.appendChild(person);
        doc.appendChild(profile);

        // 配置格式化输出
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        transformer.transform(new DOMSource(doc), new StreamResult(System.out));
    }
}

XSLT 通用处理方式

写一个XSLT样式表,专门处理空元素的格式:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- 匹配所有没有子节点的空元素 -->
  <xsl:template match="*[not(node())]">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <!-- 插入换行和对应缩进 -->
      <xsl:text>&#10;  </xsl:text>
    </xsl:copy>
  </xsl:template>

  <!-- 其他节点按默认规则处理 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

把原XML和这个XSLT文件一起处理,就能得到目标格式。

内容的提问来源于stack exchange,提问作者Vanaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:50:31