XML valideren met de XML-taak

Van toepassing op:SQL Server SSIS Integration Runtime in Azure Data Factory

Valideer XML-documenten en krijg uitgebreide foutuitvoer door de eigenschap ValidationDetails van de XML-taak in te schakelen.

De volgende screenshot toont de XML Taakeditor met de benodigde instellingen voor XML-validatie met rijke foutuitvoer.

XML-taakeigenschappen in de XML Taakeditor

Voordat de eigenschap ValidationDetails beschikbaar was, heeft XML-validatie door de XML-taak alleen een waar of onwaar resultaat geretourneerd, zonder informatie over fouten of hun locaties. Wanneer je ValidationDetails op True zet, bevat het uitvoerbestand gedetailleerde informatie over elke fout, inclusief het regelnummer en de positie. U kunt deze informatie gebruiken om fouten in XML-documenten te begrijpen, te vinden en op te lossen.

De XML-validatiefunctionaliteit schaalt eenvoudig op voor grote XML-documenten en grote aantallen fouten. Omdat het uitvoerbestand zelf in XML-formaat is, kun je de uitvoer opvragen en analyseren. Als de output bijvoorbeeld een groot aantal fouten bevat, kun je deze groeperen door een Transact-SQL query te gebruiken, zoals beschreven in dit onderwerp.

Note

SQL Server Integration Services (SSIS) introduceerde de eigenschap ValidationDetails in SQL Server 2012 (11.x) Service Pack 2. De eigenschap is ook beschikbaar in SQL Server 2014 (12.x) en in SQL Server 2016 (13.x).

Voorbeelduitvoer voor XML die geldig is

Hier is een voorbeelduitvoerbestand met validatieresultaten voor een geldig XML-bestand.

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

Voorbeelduitvoer voor XML die niet geldig is

Hier is een voorbeelduitvoerbestand met validatieresultaten voor een XML-bestand dat een klein aantal fouten bevat. De tekst van de <foutelementen> is ingepakt voor leesbaarheid.

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

Analyseer XML-validatie-output met een Transact-SQL query

Als de output van XML-validatie veel fouten bevat, kun je een Transact-SQL query gebruiken om de output in SQL Server Management Studio te laden. Vervolgens kun je de foutenlijst analyseren met alle mogelijkheden van de T-SQL-taal, waaronder WHERE, GROUP BY, ORDER BY, JOIN, enzovoort.

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

Hier is het resultaat in Management Studio van de tweede voorbeeldquery die in de voorgaande tekst wordt getoond.

Query om XML-fouten in Management Studio te groeperen