XML 表达式和模式

作者:Burak Emir

本章描述了 XML 表达式和模式的语法结构。它尽可能地遵循 XML 1.0 规范,更改是由嵌入 Scala 代码片段的可能性所强制的。

XML 表达式

XML 表达式是由以下产生式生成的表达式,其中第一个元素的起始括号 < 必须位于可以开始词法 XML 模式 的位置。

XmlExpr ::= XmlContent {Element}

XML 规范的良好格式约束适用,这意味着例如起始标签和结束标签必须匹配,并且属性只能定义一次,除了与实体解析相关的约束。

以下产生式描述了 Scala 的可扩展标记语言,其设计尽可能接近 W3C 可扩展标记语言标准。只有属性值和字符数据的产生式发生了改变。Scala 不支持声明。实体引用在运行时不会被解析。

Element       ::=    EmptyElemTag
                |    STag Content ETag

EmptyElemTag  ::=    ‘<’ Name {S Attribute} [S] ‘/>’

STag          ::=    ‘<’ Name {S Attribute} [S] ‘>’
ETag          ::=    ‘</’ Name [S] ‘>’
Content       ::=    [CharData] {Content1 [CharData]}
Content1      ::=    XmlContent
                |    Reference
                |    ScalaExpr
XmlContent    ::=    Element
                |    CDSect
                |    PI
                |    Comment

如果 XML 表达式是一个单一元素,则其值为 XML 节点的运行时表示(scala.xml.Node 的子类的实例)。如果 XML 表达式包含多个元素,则其值为 XML 节点序列的运行时表示(scala.Seq[scala.xml.Node] 的子类的实例)。

如果 XML 表达式是实体引用、CDATA 部分、处理指令或注释,则它由相应的 Scala 运行时类的实例表示。

默认情况下,元素内容中的开头和结尾空格会被移除,连续出现的空格会被替换为单个空格字符 \u0020。可以通过编译器选项更改此行为以保留所有空格。

Attribute  ::=    Name Eq AttValue

AttValue      ::=    ‘"’ {CharQ | CharRef} ‘"’
                |    ‘'’ {CharA | CharRef} ‘'’
                |    ScalaExpr

ScalaExpr     ::=    Block

CharData      ::=   { CharNoRef } ´\textit{ without}´ {CharNoRef}‘{’CharB {CharNoRef}
                                  ´\textit{ and without}´ {CharNoRef}‘]]>’{CharNoRef}

XML 表达式可以包含 Scala 表达式作为属性值或在节点内。在后一种情况下,它们使用单个左大括号 { 嵌入,并以右大括号 } 结束。要表达由 CharData 生成的 XML 文本中的单个左大括号,必须将其加倍。因此,{{ 代表 XML 文本 {,不会引入嵌入的 Scala 表达式。

BaseChar, CDSect, Char, Comment, CombiningChar, Ideographic, NameChar, PI, S, Reference
              ::=  ´\textit{“as in W3C XML”}´

Char1         ::=  Char ´\textit{ without}´ ‘<’ | ‘&’
CharQ         ::=  Char1 ´\textit{ without}´ ‘"’
CharA         ::=  Char1 ´\textit{ without}´ ‘'’
CharB         ::=  Char1 ´\textit{ without}´ ‘{’

Name          ::=  XNameStart {NameChar}

XNameStart    ::= ‘_’ | BaseChar | Ideographic
                 ´\textit{ (as in W3C XML, but without }´ ‘:’´)´

XML 模式

XML 模式是由以下产生式生成的模式,其中元素模式的左尖括号 < 必须位于开始词法 XML 模式 的位置。

XmlPattern  ::= ElementPattern

XML 规范的良好格式约束适用。

XML 模式必须是单个元素模式。它精确匹配那些具有与模式描述相同的结构的 XML 树的运行时表示。XML 模式可以包含 Scala 模式

空格的处理方式与 XML 表达式中相同。

默认情况下,元素内容中的开头和结尾空格会被移除,连续出现的空格会被替换为单个空格字符 \u0020。可以通过编译器选项更改此行为以保留所有空格。

ElemPattern   ::=    EmptyElemTagP
                |    STagP ContentP ETagP

EmptyElemTagP ::=    ‘<’  Name [S] ‘/>’
STagP         ::=    ‘<’  Name [S] ‘>’
ETagP         ::=    ‘</’ Name [S] ‘>’
ContentP      ::=    [CharData] {(ElemPattern|ScalaPatterns) [CharData]}
ContentP1     ::=    ElemPattern
                |    Reference
                |    CDSect
                |    PI
                |    Comment
                |    ScalaPatterns
ScalaPatterns ::=    ‘{’ Patterns ‘}’