Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
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.