使用 XmlReader 進行資料一致性檢查
更新: November 2007
依預設,Create 方法建立的 XmlReader 物件會比 XmlTextReader 實作更一致。依預設,Create 方法建立的 XmlReader 物件支援下列功能:
將新行字元標準化。
展開實體。
加入預設屬性。
XmlReaderSettings.CheckCharacters 及 XmlReaderSettings.ConformanceLevel 屬性可讓您指定要在已建立之 XmlReader 物件上啟用的一致性檢查型別。
CheckCharacters 設定
XmlReaderSettings 類別上的 CheckCharacters 屬性會指示讀取器檢查字元,並在發現任何字元不屬於合法 XML 字元的範圍時擲回 XmlException。啟用字元檢查時,可確保:
文件中的所有字元都屬於合法 XML 字元的範圍,如 W3C XML 1.0 建議事項 (英文) 所定義。
所有 XML 名稱都有效。例如,如果項目的名稱以數字開頭,則會擲回 XmlException。如需詳細資訊,請參閱 http://www.w3.org/TR/REC-xml\#NT-Name。
預設會啟用字元檢查。如果讀取器處理文字資料,則它會始終檢查 XML 名稱是否有效,即使 CheckCharacters 屬性設為 false 也如此。
ConformanceLevel 設定
XmlReaderSettings 類別上的 ConformanceLevel 屬性會設定 XmlReader,以檢查並確保讀取的資料流遵守一組特定規則集。根據指定的一致性層級,來檢查 XML 資料,以查看其是否符合格式正確之 XML 1.0 文件或文件片段的規則。如果資料不一致,則會擲回 XmlException。預設設定為 ConformanceLevel.Document。
注意事項: |
---|
如果設定讀取器支援 ConformanceLevel.Fragment,但 XML 資料包含文件類型定義 (DTD),則會擲回 XmlException。存在 DTD 時,XML 1.0 版建議事項會要求文件層級的一致性。 |
ConformanceLevel 值 |
說明 |
||
---|---|---|---|
Document |
XML 資料符合格式正確的 XML 1.0 文件規則。此檢查層級可確保任何處理器都可使用當做 XML 1.0 文件 (英文) 讀取的資料流。 讀取器會檢查下列項目:
|
||
Fragment |
XML 資料符合格式正確之 XML 1.0 文件片段的規則。 此設定接受在最上層具有多個根項目或文字節點的 XML 資料。此檢查層級可確保任何處理器都可使用當做 XML 1.0 外部剖析實體 (英文) 讀取的資料流。
|
||
Auto |
讀取器會依據內送資料決定要套用的一致性檢查層級。 如果 XML 資料包含 DTD 資訊,則會套用文件一致性檢查。 如果 XML 資料包含下列其中一項,則會套用片段一致性檢查:
如果存在衝突 (如根層級存在文字節點及 DTD),則會擲回 XmlException。 當使用 Create 方法向現有 XmlReader 加入其他功能時,此設定可以用於包裝案例。在此情況下,ConformanceLevel.Auto 不會加入任何新的一致性檢查。一致性檢查會留給被包裝的 XmlReader。 |
XmlTextReader、XmlValidatingReader 及 XmlNodeReader 物件
與 XmlTextReader、XmlValidatingReader 或 XmlNodeReader 物件搭配使用時,ConformanceLevel 設定會有下列行為。
如果 XmlReader 物件未使用 Create 方法建立,則會使用一致性層級 Document。因此,如果決定將此 XmlReader 執行個體包裝於另一 XmlReader 物件內,則建立新的 XmlReader 物件時,指定的一致性層級必須為 Document 或 Auto。
如果基礎 XmlTextReader 或 XmlValidatingReader 物件是使用 XmlParserContext 物件及 XmlNodeType.Element 建構的,則也可以套用 Fragment 設定。
範例
下列程式碼會建立一個讀取器,其會強制執行片段層級一致性。
Dim settings as XmlReaderSettings = new XmlReaderSettings()
settings.ConformanceLevel = ConformanceLevel.Fragment
Dim reader as XmlReader = XmlReader.Create(new StringReader(xmlString), settings)
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings);