Validar XML com a tarefa de XML

Aplica-se a: SQL Server SSIS Integration Runtime em Azure Data Factory

Valide documentos XML e obtenha uma saída de erro rica ativando a propriedade ValidationDetails da tarefa XML.

A captura de ecrã seguinte mostra o Editor de Tarefas XML com as definições necessárias para a validação de XML com saída de erros detalhada.

Propriedades da tarefa XML no Editor de Tarefas XML

Antes da propriedade ValidationDetails estar disponível, a validação XML pela Tarefa XML retornava apenas um resultado verdadeiro ou falso, sem informações sobre erros ou seus locais. Agora, quando defines o ValidationDetails para True, o ficheiro de saída contém informações detalhadas sobre cada erro, incluindo o número da linha e a posição. Você pode usar essas informações para entender, localizar e corrigir erros em documentos XML.

A funcionalidade de validação XML escala facilmente para documentos XML grandes e grandes números de erros. Como o ficheiro de saída está em formato XML, pode consultar e analisar a saída. Por exemplo, se a saída contiver um grande número de erros, pode agrupar os erros usando uma consulta Transact-SQL, como descrito neste tópico.

Note

O SQL Server Integration Services (SSIS) introduziu a propriedade ValidationDetails no SQL Server 2012 (11.x) Service Pack 2. A propriedade está também disponível no SQL Server 2014 (12.x) e no SQL Server 2016 (13.x).

Exemplo de saída para XML que seja válida

Aqui está um ficheiro de saída de exemplo com resultados de validação para um ficheiro XML válido.

  
<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>  

Exemplo de saída de XML que não é válido

Aqui está um ficheiro de saída de exemplo com resultados de validação para um ficheiro XML que contém um pequeno número de erros. O texto dos <elementos de erro> foi enrolado para maior legibilidade.

  
<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>  

Analisar a saída de validação XML com uma consulta Transact-SQL

Se a saída da validação XML contiver um grande número de erros, pode usar uma consulta Transact-SQL para carregar a saída em SQL Server Management Studio. Depois podes analisar a lista de erros com todas as capacidades da linguagem T-SQL, incluindo WHERE, GROUP BY, ORDER BY, JOIN, e assim por diante.

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');  
  

Aqui está o resultado no Management Studio da segunda consulta de exemplo mostrada no texto anterior.

Consulta para agrupar erros de XML no Management Studio