Come distruggere XML .docx?


8

Sto cercando di importare un XML (in realtà un file docx) in un database SQL Server 2008. Sono quasi un principiante nella programmazione XML. Ho cercato su Google molto ma quasi tutti gli esempi ci sono con un semplice file XML. Qui il file xml è poco complesso (vedi sotto). Potete per favore farmi un'idea di come dovrei creare la tabella per questo XML e quale query dovrei eseguire nel server SQL. Ho bisogno di valori per tutti i tag, ad es. W: rsidP, w: rsidRDefault, w: rsidR di w: p, w: pStyle, w: bookmarkStart, w: t tags ecc.

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

Risposte:


10

Quando si lavora con XML in SQL Server, si utilizzano i metodi del tipo di dati xml e durante la distruzione di documenti XML si utilizzano in genere i metodi nodes()e value(). L'XML che hai qui include anche un certo numero di spazi dei nomi, quindi devi specificare quelli che ti servono usando WITH XMLNAMESPACES (Transact-SQL) .

L'XML è piuttosto complesso, quindi senza sapere come si desidera estrarre i dati, posso darti solo un paio di domande di esempio che puoi modificare in qualsiasi cosa tu abbia bisogno.

Hai quattro w:pnodi e qui è una query che recupera gli attributi da quei nodi. Utilizzando @specifica che è il valore di un attributo che desideri-

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

Se oltre a ciò si desidera il testo nel w:tnodo, è necessario eseguire cross applyuna seconda nodes()clausola che distruggerà l'XML all'interno del w:pnodo.

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

Nella tua domanda hai detto che vuoi ottenere i valori da tutti i tag. Non so quanto sia utile per te, ma puoi creare un elenco Nome-Valore con tutti gli attributi e gli elementi nell'XML.

Questo ti darà tutti gli elementi.

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

Passa '//*'a '//@*'e otterrai tutti gli attributi.

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

E puoi combinarli anche in una query.

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

SQL Fiddle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.