Validate XML with the XML Task
適用於: SQL Server Azure Data Factory 中的 SSIS Integration Runtime
驗證 XML 文件,並啟用 XML 工作的 ValidationDetails 屬性以取得詳細的錯誤輸出。
下列螢幕擷取畫面顯示 [XML 工作編輯器],內含具有豐富錯誤輸出之 XML 驗證所需的設定。
在提供 ValidationDetails 屬性前,XML 工作所執行的 XML 驗證只會傳回結果為 True 或 False,而不會有錯誤的相關資訊及其位置。 現在,當您將 ValidationDetails 設定為 True 時,輸出檔案即涵蓋每項錯誤的詳細資訊,包括行號及位置。 您可以使用此資訊來了解、尋找及修正 XML 文件中的錯誤。
XML 驗證功能可針對大型 XML 文件和大量的錯誤輕鬆地進行調整。 因為輸出檔案本身是 XML 格式,所以您可以查詢和分析輸出。 例如,若輸出包含大量錯誤,您可以使用 Transact-SQL 查詢將錯誤分組 (如本主題中所述)。
注意
SQL Server Integration Services ( SSIS) 在 SQL Server 2012 (11.x) Service Pack 2 中引進 ValidationDetails 屬性。 該屬性也適用於 SQL Server 2014 (12.x) 與 SQL Server 2016 (13.x)。
有效 XML 範例輸出
以下範例輸出檔案具有有效 XML 檔案的驗證結果。
<root xmlns:ns="https://schemas.microsoft.com/xmltools/2002/xmlvalidation">
<metadata>
<result>true</result>
<errors>0</errors>
<warnings>0</warnings>
<startTime>2015-05-28T10:27:22.087</startTime>
<endTime>2015-05-28T10:29:07.007</endTime>
<xmlFile>d:\Temp\TestData.xml</xmlFile>
<xsdFile>d:\Temp\TestSchema.xsd</xsdFile>
</metadata>
<messages />
</root>
無效 XML 範例輸出
以下範例輸出檔案具有含有少量錯誤之 XML 檔案的驗證結果。 <error> 元素的文字已換行,以增加可讀性。
<root xmlns:ns="https://schemas.microsoft.com/xmltools/2002/xmlvalidation">
<metadata>
<result>false</result>
<errors>2</errors>
<warnings>0</warnings>
<startTime>2015-05-28T10:45:09.538</startTime>
<endTime>2015-05-28T10:45:09.558</endTime>
<xmlFile>C:\Temp\TestData.xml</xmlFile>
<xsdFile>C:\Temp\TestSchema.xsd</xsdFile>
</metadata>
<messages>
<error line="5" position="26">The 'ApplicantRole' element is invalid - The value 'wer3' is invalid
according to its datatype 'ApplicantRoleType' - The Enumeration constraint failed.</error>
<error line="16" position="28">The 'Phone' element is invalid - The value 'we3056666666' is invalid
according to its datatype 'phone' - The Pattern constraint failed.</error>
</messages>
</root>
使用 Transact-SQL 查詢分析 XML 驗證輸出
若 XML 驗證的輸出包含大量錯誤,您可以使用 Transact-SQL 查詢來載入 SQL Server Management Studio 中的輸出。 然後,您可以使用 T-SQL 語言的所有功能 (包括 WHERE、GROUP BY、ORDER BY、JOIN 等) 來分析錯誤清單。
DECLARE @xml XML;
SELECT @xml = XmlDoc
FROM OPENROWSET (BULK N'C:\Temp\XMLValidation_2016-02-212T10-41-00.xml', SINGLE_BLOB) AS Tab(XmlDoc);
-- Query # 1, flat list of errors
-- convert to relational/rectangular
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/xmltools/2002/xmlvalidation' AS ns), rs AS
(
SELECT col.value('@line','INT') AS line
, col.value('@position','INT') AS position
, col.value('.','VARCHAR(1024)') AS error
FROM @XML.nodes('/root/messages/error') AS tab(col)
)
SELECT * FROM rs;
-- WHERE error LIKE '%whatever_string%'
-- Query # 2, count of errors grouped by the error message
-- convert to relational/rectangular
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/xmltools/2002/xmlvalidation' AS ns), rs AS
(
SELECT col.value('@line','INT') AS line
, col.value('@position','INT') AS position
, col.value('.','VARCHAR(1024)') AS error
FROM @XML.nodes('/root/messages/error') AS tab(col)
)
SELECT COALESCE(error,'Total # of errors:') AS [error], COUNT(*) AS [counter]
FROM rs
GROUP BY GROUPING SETS ((error), ())
ORDER BY 2 DESC, COALESCE(error, 'Z');
以下是 Management Studio 中的結果,位於先前文字所示的第二個範例查詢。