2016-08-11 5 views
0

Ich versuche, T-SQL's OPENXML Funktion verwenden, um XML in Tabellenform zu analysieren, aber ich bekomme irreführende Fehler in Anwesenheit von Namespace-Attributen.Wie Namespace-Attribute mit OPENXML verwenden?

Zum Beispiel SQL Server beanspruchen den folgend zu diesem wohlgeformten XML-Dokument:

DECLARE @hdoc int; 
DECLARE @doc varchar(1000); 

SET @doc = 
' 
<?xml version="1.0" encoding="UTF-8"?> 

<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2016-06-13"> 
    <Record userId="123456" username="jeffp" termId="129" dmd:surveyId="1234567"> 
     <dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/> 
     <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/> 
     <dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/> 
     <dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/> 
     <GENSERVE id="33426841601" dmd:lastModified="2011-03-15T10:23:01" dmd:startDate="2010-07-01"> 
      <TYPE>University</TYPE> 
      <TYPEOTHER/> 
      <ORG>University Academic Advising Council </ORG> 
      <ROLE>Committee Member</ROLE> 
      <ROLEOTHER/> 
      <OFFICE>President/Elect/Past</OFFICE> 
      <RESPONSIBILITIES/> 
      <NUMHOURS/> 
      <ELECAPP>Elected</ELECAPP> 
      <AUDIENCE>Local</AUDIENCE> 
      <EXOFFICIO/> 
      <DTM_START>July</DTM_START> 
      <DTD_START/> 
      <DTY_START>2010</DTY_START> 
      <START_START>2010-07-01</START_START> 
      <START_END>2010-07-31</START_END> 
      <DTM_END/> 
      <DTD_END/> 
      <DTY_END/> 
      <END_START></END_START> 
      <END_END></END_END> 
     </GENSERVE> 
    </Record> 
</Data> 
'; 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc; 

SELECT * 
FROM  OPENXML (@hdoc, '/Data/Record/GENSERVE', 2) 
      with(TYPE varchar(250), 
       ORG varchar(250) ) 

exec sp_xml_removedocument @hdoc; 
The XML parse error 0xc00ce55e occurred on line number 20, near the XML text "   <AUDIEN". 
The error description is 'Element was not closed.'. 

Nun, das ist einfach lächerlich ist, weil, wenn ich einfach diese Zeilen löscht:

<dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/> 
    <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/> 
    <dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/> 
    <dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/> 

Dann bekomme ich keine Fehler - aber auch keine Daten - nur leere Spalten.

Nur wenn ich gehe und lösche alle Verweis auf einen Namespace, dann wird es funktionieren.

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Record userId="123456" username="jeffp" termId="129"> 
     <GENSERVE id="33426841601" > 
      <TYPE>University</TYPE> 
      <TYPEOTHER/> 
      <ORG>University Academic Advising Council </ORG> 
      <ROLE>Committee Member</ROLE> 
      <ROLEOTHER/> 
      <OFFICE>President/Elect/Past</OFFICE> 
      <RESPONSIBILITIES/> 
      <NUMHOURS/> 
      <ELECAPP>Elected</ELECAPP> 
      <AUDIENCE>Local</AUDIENCE> 
      <EXOFFICIO/> 
      <DTM_START>July</DTM_START> 
      <DTD_START/> 
      <DTY_START>2010</DTY_START> 
      <START_START>2010-07-01</START_START> 
      <START_END>2010-07-31</START_END> 
      <DTM_END/> 
      <DTD_END/> 
      <DTY_END/> 
      <END_START></END_START> 
      <END_END></END_END> 
     </GENSERVE> 
    </Record> 
</Data> 
TYPE   ORG 
University University Academic Advising Council 

Wie kann ich in den Namespace Attribute lesen Sie auch?

Antwort

2

Ihre XML-Zeichenfolge ist abgeschnitten, da ihre Länge mehr als varchar(1000) ist, daher der XML-Parsing-Fehler. Die Fehlermeldung hat nichts mit Namespace zu tun.

Jetzt kommen die Namespace-Problem .. Beachten Sie, dass Ihr XML Standard-Namespace (Namespace ohne Präfix deklariert) hat. Alle an Ihrer Abfrage beteiligten Elemente erben implizit den Standardnamespace von Data. Sie benötigen einen Präfix für den Standard-Namespace-URI kartieren, und das Präfix verwenden Elemente im Namensraum in Ihrer OPENXML-Abfrage zu verweisen:

DECLARE @doc varchar(5000); 

..... 

EXEC sp_xml_preparedocument @hdoc OUTPUT, 
    @doc, 
    '<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />'; 

SELECT * 
FROM  OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2) 
      with(TYPE varchar(250) 'd:TYPE', 
       ORG varchar(250) 'd:ORG') 

Wenn in Ihrer SQL Server-Version verfügbar ist, mögen Sie vielleicht von SQL Server prüfen, mit XQuery und XML Datentyp:

DECLARE @xml XML = 'your xml string here' 

;WITH XMLNAMESPACES (DEFAULT 'http://www.digitalmeasures.com/schema/data') 
SELECT 
    t.c.value('TYPE[1]', 'VARCHAR(100)') AS TYPE, 
    t.c.value('ORG[1]', 'VARCHAR(100)') AS ORG 
FROM @xml.nodes('/Data/Record/GENSERVE') t(c) 
+1

Oh super, danke, das macht so viel Sinn Ich fühle mich dumm! Ich freue mich darauf, es zu versuchen, wenn ich wieder an die Arbeit komme, danke! –

+1

Nochmals vielen Dank, dass Sie nicht nur mein dummes Problem behoben und meine Frage beantwortet haben, sondern vor allem Ihre verbesserte Lösung * mit dem XQuery- und XML-Datentyp von SQL Server *, die mir völlig unbekannt war. Weg zur Lösung [das XY-Problem] (http://meta.stackexchange.com/a/66378/321521)! –