在XML中如何处理空白字符 xml:space属性用法

15次阅读

xml:space属性用于显式控制元素及其子元素内空白字符的处理方式,取值default(合并连续空白)或preserve(严格保留所有空白),具有继承性,仅影响字符数据,不作用于属性值。

在XML中如何处理空白字符 xml:space属性用法

XML 中的空白字符(空格、制表符、换行)默认会被解析器“保留但不显著”,具体是否保留、是否影响内容,取决于元素用途和解析器行为。而 xml:space 属性就是用来**显式控制某个元素及其子元素内空白字符的处理方式**的标准机制。

xml:space 属性的两个合法值

xml:space 是一个预定义的 XML 属性(属于 XML 命名空间),只能取以下两个值之一:

  • default:表示遵循解析器的默认规则——通常会**合并连续空白(如多个空格变一个,换行/制表符可能被转为空格或忽略)**,适用于大多数结构化内容(如 John Doe 解析后常为 "John Doe")。
  • preserve:表示**严格保留所有空白字符原样**(包括开头空格、缩进、换行、制表符),适用于需要格式精确的内容,比如代码块、诗歌、配置文本等。

作用范围是当前元素及其所有后代元素

xml:space 具有继承性。一旦在某个元素上声明,它会影响该元素内部的所有文本节点(包括嵌套子元素中的文本),除非子元素显式覆盖该属性。

例如:

  Roses are red,
  Violets are blue.

其中的缩进空格和换行都会被保留;但如果在 内部某处写 ...,那该 内的空白就会按默认方式处理。

实际使用注意事项

  • 不能用于属性值内部:xml:space 只影响元素的字符数据(#PCDATA),对属性值里的空白无影响(属性值中的空白始终按规范归一化:首尾截断、中间多个空白压缩为单个空格)。
  • 解析器必须支持才生效:主流解析器(如 javadom/SAX、python 的 lxml、.net 的 XmlReader)都支持,但需确保解析时未禁用命名空间或忽略 xml:* 属性。
  • 不是“美化输出”的开关:它不控制序列化时是否加缩进,只控制解析阶段如何对待输入中的空白;输出格式由序列化器单独决定。
  • css white-space 无关:这是纯 XML 解析层语义,和 html/CSS 渲染无关;若用 XSLT 转成 HTML,需额外用 white-space: pre 等样式来呈现保留的换行。

什么时候该用 preserve?

典型场景包括:

  • 嵌入源代码片段:for (int i=0; i  System.out.println(i);
  • 多行地址或诗歌:
    123 Main St.
    Apt 4B
    New York, NY

  • 需要逐字比对的协议文本或日志片段。

其余多数情况(如人名、标题、描述性文字)用默认行为更自然,避免因意外缩进导致数据异常。

text=ZqhQzanResources