Validate XML with the XML Task
Gilt für: SQL Server SSIS Integration Runtime in Azure Data Factory
Validieren Sie XML-Dokumente und erhalten Sie eine umfangreiche Fehlerausgabe durch die Aktivierung der Eigenschaft ValidationDetails des XML-Tasks.
Die folgende Abbildung zeigt den XML-Task-Editor mit den Einstellungen für die XML-Validierung mit umfassender Fehlerausgabe.
Bevor die Eigenschaft ValidationDetails verfügbar war, gab die XML-Validierung durch den XML-Task nur „true“ oder „false“ als Ergebnis zurück, ohne Informationen zu Fehlern oder wo diese auftraten. Wenn Sie jetzt die Eigenschaft ValidationDetails auf TRUE festlegen, enthält die Ausgabedatei ausführliche Informationen zu jedem Fehler, einschließlich der Zeilennummer und der Position. Sie können diese Informationen verwenden, um Fehler in XML-Dokumenten zu verstehen, zu finden und zu beheben.
Die XML-Validierungsfunktion lässt sich problemlos auch für große XML-Dokumente und eine große Anzahl von Fehlern skalieren. Da die Ausgabedatei selbst im XML-Format ist, können Sie die Ausgabe abfragen und analysieren. Wenn die Ausgabe beispielsweise eine große Anzahl von Fehlern enthält, können Sie die Fehler mit Hilfe einer Transact-SQL-Abfrage gruppieren, wie in diesem Thema beschrieben.
Hinweis
In SQL Server Service Pack 2 von Integration Services SSIS ( ) wurde die Eigenschaft ValidationDetailsSQL Server 2012 (11.x) eingeführt. Die Eigenschaft ist auch in SQL Server 2014 (12.x) und in SQL Server 2016 (13.x)verfügbar.
Beispielausgabe für eine XML-Datei ohne Fehler
Hier ist eine Beispiel-Ausgabedatei mit Validierungsergebnissen für eine gültige XML-Datei.
<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>
Beispielausgabe für eine XML-Datei mit Fehlern
Hier ist eine Beispiel-Ausgabedatei mit Validierungsergebnissen für eine XML-Datei mit einer geringen Anzahl an Fehlern. Der Text der <error>-Elemente wurde zur besseren Lesbarkeit umbrochen.
<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>
Analysieren der XML-Validierungsausgabe mit einer Transact-SQL-Abfrage
Wenn die Ausgabe der XML-Validierung eine große Anzahl von Fehlern enthält, können Sie eine Transact-SQL-Abfrage verwenden, um die Ausgabe in SQL Server Management Studio zu laden. Danach können Sie die Fehlerliste mit allen Funktionen der Programmiersprache T-SQL, einschließlich WHERE, GROUP BY, ORDER BY, JOIN usw. analysieren.
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 ist das Ergebnis in Management Studio der zweiten Beispielabfrage aus dem vorangegangenen Text.