Validate XML with the XML Task
适用于:SQL Server
Azure 数据工厂中的 SSIS Integration Runtime
通过启用 XML 任务的 ValidationDetails 属性,验证 XML 文档并获取丰富的错误输出。
下面的屏幕快照显示 XML 任务编辑器,其中包含具有丰富错误输出的 XML 验证所需的设置。
在可以使用 ValidationDetails 属性之前,XML 任务的 XML 验证仅返回 true 或 false 结果,而不包含关于错误或其位置的详细信息。 现在,当你将 ValidationDetails 设置为 True 时,输出文件将包含关于每个错误的详细信息,包括行号和位置。 此信息可用于了解、查找和修复 XML 文档中的错误。
XML 验证功能可轻松扩展以适应大型 XML 文档和大量错误。 由于输出文件本身采用 XML 格式,你可以查询和分析输出。 例如,如果输出中包含大量错误,你可以按本主题中所述,使用 Transact-SQL 查询对错误分组。
注意
SQL Server Integration Services (SSIS) 在 Service Pack 2 中引入了 ValidationDetails 属性SQL Server 2012 (11.x)。 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 中的结果。