转:XML 中的空白字符须知:xml:space
了解 XML 空白字符的概念并掌握如何避免與之相關的問題的技巧。
2006 年 4 月發布
很多時候,您可能都沒注意到,在 XML 中所做的更改影響著您訪問 XML 文檔中數據的方式。例如:
<Author><FirstName>John</FirstName> <LastName>Smith</LastName></Author>
完全不同于
<Author>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Author>
以下是一個完整的示例(請參閱示例代碼中的示例 1):假設您希望使用 DOM API 獲取 <Author> 的第一個子元素,如下所示:
XMLDocument doc = parser.getDocument(); Element elem = doc.getDocumentElement(); Node node = elem.getFirstChild();
利用 Oracle XDK DOM 分析器的默認設置,第一個文檔返回 <FirstName> 的同時,第二個文檔返回一個為空白字符節點的文本節點。
同樣,有時 XSLT 轉換不會生成您預期的結果。(請參閱示例 2。)XML 文檔需要使用 XSLT 進行轉換。XSL 樣式表使用 position() 函數來為 <Chapter> 和 <Section> 元素創建排序信息:
<?xml version="1.0"?> <Book> <Chapter> <Section/> <Section/> <Section/> </Chapter> <Chapter> <Section/> <Section/> <Section/> </Chapter> </Book>
然而,以下 XSL 樣式表:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:attribute name="Position">
<xsl:value-of select="position()"/>
</xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
并不會按期望運行,它將產生以下結果:
<?xml version = '1.0' encoding = 'UTF-8'?> <Book Position="1"> <Chapter Position="2"> <Section Position="2"/> <Section Position="4"/> <Section Position="6"/> </Chapter> <Chapter Position="4"> <Section Position="2"/> <Section Position="4"/> <Section Position="6"/> </Chapter> </Book>
位置不正確是由空白字符造成的。如果在 XSLT 轉換中調用 position() 函數刪除之前使用以下樣式表刪除空白字符:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
將生成期望的結果:
<?xml version = '1.0' encoding = 'UTF-8'?> <Book Position="1"> <Chapter Position="1"> <Section Position="1"/> <Section Position="2"/> <Section Position="3"/> </Chapter> <Chapter Position="2"> <Section Position="1"/> <Section Position="2"/> <Section Position="3"/> </Chapter> </Book>
對于此例,如果不希望刪去所有 XML 元素的空白字符,可使用 <xsl:strip-space element="Book,Chapter, Section"> 代替。
以下部分將介紹 XML 空白字符的概念以及避免此類問題的技巧。
什么是 XML 空白字符?
XML 將以下四種字符歸為空白字符:回車符( 或 ch(13))、換行符(
或 ch(10))、制表符 ( ) 以及空格 (' ')。在 XML 文檔中,空白字符分為兩類:
有意義空白字符是文檔內容的一部分,應予以保留。
無意義空白字符在編輯 XML 文檔時使用,以增加可讀性。這些空白字符一般在文檔交付時不予保留。
通常,若沒有 DTD (文檔類型定義(Document Type Definition)是一套為了進行程序間的數據交換而建立的關于標記符的語法規則)或 XML 模式定義,所有空白字符都是有意義空白字符,應當保留。然而,如果有 DTD 或 XML 模式定義,則只有以下內容中的空白字符有意義:
<sig> ------------------ John Smith Product Manager Example.com -------------------- </sig>
XML 處理器如何處理 XML 空白字符
XML 標準詳細說明了 XML 處理器應如何處理空白字符。
XML 分析:XML 規范提供了一個內置屬性xml:space來告知 XML 分析器其是否應忽略空白字符。該屬性由其根元素的子元素來繼承。聲明時,必須將其指定為枚舉類型,其可能的值只能是“default”和“preserve”。如果指定為“preserve”,則所定義元素內的空白字符必須保留。
根據 W3C XML 規范,默認情況下,Oracle XML 開發人員工具包 (XDK) XML 分析器將保留所有空白字符。因此,xml:space=“default”或xml:space=“preserve”將具有相同的作用:保留空白字符。若要避免保留空白字符,需要按如下所示設置 Oracle XDK 分析器:
XDK DOM Parser:
DOMParser parser = new DOMParser(); parser.setPreserveWhitespace(false);
SAX Parser:
SAXParser parser = new SAXParser(); parser.setPreserveWhitespace(false);
XSLT 轉換。W3C XSLT 規范提供了兩個元素(即xsl:strip-space和xsl:preserve-spacea€”)來處理空白字符。xsl:strip-space指定了應刪除空白字符文本節點(即文本節點完全由空白字符組成)的 XML 元素。請注意,xsl:strip-space只有影響純空白字符的節點。xsl:strip-space可以列為一組由空白字符或使用通配符(例如 *)隔開的元素。xsl:preserve-space具有類似的語法,但執行的結果卻與xsl:strip-space正好相反。
以下示例(請參閱示例 3)應用了一個復制源文檔的 XSL 樣式表,但刪去了空白字符文本節點:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/> <xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
對于如下所示的 XML 文檔:
<rootElement> <childElement test="true"> Value </childElement>This is the test <childElement test="true" xml:space="preserve"> Value </childElement> <childElement xml:space="preserve"> </childElement> <childElement> </childElement> </rootElement>
XSLT 轉換將生成以下結果:
<rootElement><childElement test="true"> Value </childElement>This is the test <childElement test="true" xml:space="preserve"> Value </childElement><childElement xml:space="preserve"> </childElement><childElement/></rootElement>
您可能注意到,如果 XML 元素中的xml:space="preserved",則不會刪去空白字符。這種行為基于 XSLT 規范,該規范定義了保留空白字符的條件:
文本節點的父元素具有的 xml:space 屬性值為 preserve,并且沒有更近的父元素具有帶有默認值的 xml:space。
XSLT 還提供normalize-space()函數,將包含多個空白字符的字符串轉換為一個空白字符,從作為參數傳遞給它的字符串刪除所有前導空白字符和尾隨空白字符。
DOM 序列化。序列化 XML 文檔時,輸出縮進將添加無意義空白字符。默認情況下,Oracle XDK DOM 分析器將以縮進格式打印 XML DOM 文檔。
要避免縮進,在 XDK 9i 中,可將oracle.xml.parser.v2.XMLPrintDriver 類劃分為子類,如下所示(請參閱示例 4):
import oracle.xml.parser.v2.XMLPrintDriver; import oracle.xml.parser.v2.XMLOutputStream;
class MyXMLPrintDriver extends XMLPrintDriver
{
public MyXMLPrintDriver(java.io.OutputStream A)
{
super(A);
out.setOutputStyle(XMLOutputStream.COMPACT);
}
}
在 Oracle XDK 10g中,新增了一個函數 oracle.xml.parser.v2.XMLPrintDriver.setFormatPrettyPrint(),可用于避免執行子類劃分操作。使用 Oracle XDK 10g,您可以打印不帶縮進的 XML DOM 文檔,如下所示(請參閱示例 5):
XMLPrintDriver myprint = new XMLPrintDriver(System.out); myprint.setFormatPrettyPrint(false); Xml_doc.print(myprint);
結論
現在,利用這些基本知識,您可以成功避免由 XML 文檔中的空白字符引發的問題。
原鏈接:http://www.oracle.com/technetwork/cn/topics/xml/wang-whitespace-095149-zhs.html
總結
以上是生活随笔為你收集整理的转:XML 中的空白字符须知:xml:space的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何批量转化成jpg格式_heic图片格
- 下一篇: antd table 时间搜索_antd