Wie zerkleinere ich .docx XML?

8

Ich versuche, eine XML-Datei (eigentlich eine DocX-Datei) in eine SQL Server 2008-Datenbank zu importieren. Ich bin fast ein Anfänger in der XML-Programmierung. Ich habe viel gegoogelt, aber fast alle Beispiele gibt es mit einfachen XML-Dateien. Hier ist die XML-Datei wenig komplex (siehe unten). Können Sie mir bitte eine Vorstellung davon geben, wie ich die Tabelle für dieses XML erstellen soll und welche Abfrage ich auf einem SQL Server ausführen soll? Ich benötige Werte für alle Tags, z. B. w: rsidP, w: rsidRDefault, w: rsidR von w: p, w: pStyle, w: bookmarkStart, w: t-Tags usw.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body>
<w:p w:rsidR="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0">
<w:pPr><w:pStyle w:val="Heading1"/>
</w:pPr><w:bookmarkStart w:id="0" w:name="_Toc212523610"/>
<w:r>
<w:t>Summary</w:t>
</w:r>
<w:bookmarkEnd w:id="0"/>
</w:p>
<w:p w:rsidR="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0"><w:pPr><w:pStyle w:val="mainbodytext"/><w:ind w:right="-694"/><w:rPr><w:b/><w:bCs/></w:rPr></w:pPr><w:r><w:rPr><w:b/><w:bCs/></w:rPr><w:t>What is the Group Defined Practice for Integrity Management?</w:t></w:r></w:p>
<w:p w:rsidR="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0"><w:pPr><w:pStyle w:val="mainbodytext"/></w:pPr><w:r><w:t xml:space="preserve">This Practice is derived from the GP Group Standard, GRP 01 January 2006, </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>Integrity</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t xml:space="preserve"> Management.  In developing QMS it has been possible to embed much of the content of the IM Standard directly into the Group Essentials statements.  For elements 2, 7, 8 and 9 of the Standard it was possible to do that in their entirety and therefore content of those elements are not repeated within this Practice.</w:t></w:r></w:p></w:body></w:document>
user23683
quelle

Antworten:

10

Wenn Sie mit XML in SQL Server arbeiten, verwenden Sie die XML-Datentypmethoden, und wenn Sie XML-Dokumente vernichten, verwenden Sie normalerweise die Methoden nodes()und value(). Das XML, das Sie hier haben, enthält auch eine Reihe von Namespaces, sodass Sie diejenigen angeben müssen, die Sie mit WITH XMLNAMESPACES (Transact-SQL) benötigen .

Das XML ist recht komplex. Ohne zu wissen, wie die Daten extrahiert werden sollen, kann ich Ihnen nur einige Beispielabfragen geben, die Sie dann an die gewünschten Daten anpassen können.

Sie haben vier w:pKnoten und hier ist eine Abfrage, die die Attribute von diesen Knoten abruft. Verwenden @gibt an, dass dies der Wert eines Attributs ist, das Sie möchten.

with xmlnamespaces('http://schemas.openxmlformats.org/wordprocessingml/2006/main' as w)
select P.X.value('@w:rsidR', 'char(8)') as rsidR,
       P.X.value('@w:rsidRDefault', 'char(8)') as rsidRDefault,
       P.X.value('@w:rsidP', 'char(8)') as rsidP
from @doc.nodes('/w:document/w:body/w:p') as P(X);

SQL Fiddle

Wenn Sie zusätzlich den Text im w:tKnoten haben möchten , müssen Sie cross applyeine zweite nodes()Klausel ausführen, die das XML innerhalb des w:pKnotens vernichtet.

with xmlnamespaces('http://schemas.openxmlformats.org/wordprocessingml/2006/main' as w)
select P.X.value('@w:rsidR', 'char(8)') as rsidR,
       P.X.value('@w:rsidRDefault', 'char(8)') as rsidRDefault,
       P.X.value('@w:rsidP', 'char(8)') as rsidP,
       T.X.value('text()[1]', 'nvarchar(max)') as Text
from @doc.nodes('/w:document/w:body/w:p') as P(X)
  cross apply P.X.nodes('w:r/w:t') as T(X);

SQL Fiddle

Sie haben in Ihrer Frage gesagt, dass Sie die Werte von allen Tags erhalten möchten. Ich weiß nicht, wie nützlich dies für Sie ist, aber Sie können eine Name-Wert-Liste mit allen Attributen und Elementen im XML erstellen.

Dies gibt Ihnen alle Elemente.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//*') as T(X)

Wechseln Sie '//*'zu '//@*'und Sie erhalten alle Attribute.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//@*') as T(X)

Und Sie können sie auch in einer Abfrage kombinieren.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//@*, //*') as T(X)

SQL Fiddle

Mikael Eriksson
quelle