SXML是為了方便在LispScheme中使用XML而設計開發的,用於將XML數據(XML Infosets [1])編寫為S-表達式的一種替代語法。

SXML
副檔名
.sxml, .scm
類型代碼英語Type code文本
格式類型標記語言

下面的對比表格顯示了XML、SXML之間的異同:

XML SXML
<tag attr1="value1"
   attr2="value2">
 <nested>Text node</nested>
 <empty/>
</tag>
(tag (@ (attr1 "value1")
    (attr2 "value2"))(tag (@ (attr1 "value1")
    (attr2 "value2"))
 (nested "Text node")
 (empty))

與XML(和其他類似XML的語言)相比,SXML的優點是可以被Scheme解析器直接解析。儘管SXML的系統略顯不成熟,文檔也比較簡單,David Mertz還是在他的IBM developerWorks專欄中盛讚SXML的相關工具和文檔。 [2]

實例

下面是一個簡單的XHTML頁面:

 <html xmlns="http://www.w3.org/1999/xhtml"
     xml:lang="en" lang="en">
  <head>
    <title>An example page</title>
  </head>
  <body>
    <h1 id="greeting">Hi, there!</h1>
    <p>This is just an &gt;&gt;example&lt;&lt; to show XHTML &amp; SXML.</p>
  </body>
 </html>

使用SXML編寫的同一頁面如下所示:

 (*TOP* (@ (*NAMESPACES* (x "http://www.w3.org/1999/xhtml")))
 (x:html (@ (xml:lang "en") (lang "en"))
  (x:head
    (x:title "An example page"))
  (x:body
    (x:h1 (@ (id "greeting")) "Hi, there")
    (x:p "This is just an >>example<< to show XHTML & SXML."))))

在SXML中,原本元素的標籤對(「<標籤名>和</標籤名>」)都由一組括號代替。 標籤名只是列表中的第一個字符串,末尾不重複。 元素的屬性和/或值則直接跟在後面,不需要通過特殊的語法(比如添加「=」)標記出來。在SXML中,屬性、值都是節點,使用@來標記哪些節點是屬性,而且由於XML中@不能作為元素名,也就不存在@與元素名衝突的問題。 在SXML中經常可以見到把XML中定義的非法名稱作為特殊標識符使用的情況。

此外,在SXML中,由於所有的值都被視為沒有標籤的純字符串,「&」和「<>」這樣的字符無需轉義寫成「&amp/&lt/&gt」。從好的方面來講,這意味着插入自動生成的內容要容易得多,並且不存在忘記為用戶顯示的內容轉義的問題,但同時也可能導致各種跨站點腳本攻擊的泛濫或其他開發時候的麻煩。

參考資料

  1. ^ Kiselyov, Oleg. SXML Specification. ACM SIGPLAN Notices. 2002, 37 (6): 52–58. doi:10.1145/571727.571736. 
  2. ^ Mertz, David. XML Matters: Investigating SXML and SSAX. IBM developerWorks. 23 October 2003 [10 January 2015]. (原始內容存檔於2004-12-04). 

外部連結