如何实现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> </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
相关产品推荐
相关产品推荐

