在XML文档里,节点内容跨越多行是非常常见的情况,例如日志信息、SQL语句或者描述文本往往会带有换行。理解解析器如何处理这些多行节点,是正确读取和生成XML的关键。

XML多行节点的解析行为
XML规范中,节点内的换行符和空白默认都是文本内容的一部分。多数解析器在读取时不会自动删除换行,但在序列化输出时可能会因格式化参数不同而表现不一。使用<pre>这类标签时要注意,其内部空白会被保留。
DOM方式保留多行文本
通过DOM解析,可以直接获取节点的 textContent,多行内容会完整保留。下面以Java为例:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class XmlMultiLine {
public static void main(String[] args) throws Exception {
String xml = "<note><body>第一行n第二行n第三行</body></note>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
// 获取多行节点文本
String text = doc.getElementsByTagName("body").item(0).getTextContent();
System.out.println(text);
}
}
SAX方式逐行处理
如果XML很大,可以用SAX在 characters 回调中拼接多行内容:
import xml.sax
class Handler(xml.sax.ContentHandler):
def __init__(self):
self.buffer = []
def startElement(self, name, attrs):
if name == "body":
self.buffer = []
def characters(self, content):
# content可能按行分多次回调
self.buffer.append(content)
def endElement(self, name):
if name == "body":
print("".join(self.buffer))
xml.sax.parseString(b"<note><body>行一n行二</body></note>", Handler())
生成多行节点的注意事项
在生成XML时,如果需要输出多行文本,应避免额外缩进破坏原格式。可以使用 CDATA 区块包裹多行内容,这样解析器不会处理其中的特殊字符:
<note> <body><![CDATA[SELECT * FROM user WHERE age > 18]]></body> </note>
常见错误与建议
- 不要以为换行会被自动忽略,写入时请明确是否保留。
- 使用转义字符处理 < 与 >,避免破坏XML结构。
- 在配置文件中,多行节点建议用CDATA提升可读性。
处理多行节点的核心,是清楚解析器对空白和换行的保留规则,并在读写两端保持一致。