Как извлечь данные из xml, используя xml value () и метод openxml? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть XML в этом формате:

        <Root>
           <Node-1>
              <Attribute Name="Header-1"/>
              <Attribute Name="Header-2"/>
              <Attribute Name="Header-3">Value-1</Attribute> ------- Head_Name
              <Attribute Name="Header-4">Value-2</Attribute> 
              <Attribute Name="Header-5">value-3</Attribute>
              <Attribute Name="Id_Header">10101010</Attribute>
           </Node-1>
           <Node-2>
              <Attribute Name="Header-6">Value-4</Attribute>
              <Attribute Name="Header-7"/>
              <Attribute Name="Date_Header">2011-06-04 12:51:54.0</Attribute>
              <Attribute Name="Header-8"/>
              <Attribute Name="Header-9">Value-5</Attribute>
              <Attribute Name="Header-10">Value-6</Attribute>
              <Attribute Name="Header-11">Value-7</Attribute>
              <Attribute Name="Header-12"/>
              <Attribute Name="Header-13">Value-8</Attribute>
              <Attribute Name="Header-14">Value-9</Attribute>
              <Attribute Name="Header-15">Value-10</Attribute>
           </Node-2>
           <Sub-Node-2/>
           <Node-3>
              <Sub-Node-3>
                 <Node-1>
                    <Attribute Name="Header-16">Value-11</Attribute> ------- type
                    <Attribute Name="Header-17"/>
                    <Attribute Name="Header-18">Value-12</Attribute>
                    <Attribute Name="Header-19">Value-13</Attribute>
                    <Attribute Name="Header-20">Value-14</Attribute> ------- name
                 </Node-1>
                 <Relationship type="Sub-Header-1">
                    <Attribute Name="Header-21">Value-15</Attribute> ------- Quantity
                 </Sub-Node-2>
                 <Node-3/>
              </Sub-Node-3>
              <Sub-Node-3>
                 <Node-1>
                    <Attribute Name="Header-16">Value-16</Attribute> ------- type
                    <Attribute Name="Header-17"/>
                    <Attribute Name="Header-18">Value-17</Attribute>
                    <Attribute Name="Header-19">Value-18</Attribute>
                    <Attribute Name="Header-20">Value-19</Attribute> ------- name
                 </Node-1>
                 <Relationship type="Sub-Header-1">
                    <Attribute Name="Header-21">Value-20</Attribute> ------- Quantity
                 </Relationship>
                 <Node-3/>
              </Sub-Node-3>
              <Sub-Node-3>
                 <Node-1>
                    <Attribute Name="Header-16">Value-21</Attribute> ------- type
                    <Attribute Name="Header-17"/>
                    <Attribute Name="Header-18">Value-22</Attribute>
                    <Attribute Name="Header-19">Value-23</Attribute>
                    <Attribute Name="Header-20">Value-24</Attribute> ------- name
                 </Node-1>
                 <Relationship type="Sub-Header-1">
                    <Attribute Name="Header-21">Value-25</Attribute> ------- Quantity
              <Sub-Node-3>
           </Node-3>
        </Root>

Я хочу, чтобы в запросе SQL отображались следующие значения:

enter image description here


Используя Openxml, я попробовал это:

    CREATE TABLE #WorkingTable
    (
        COLUMN1 XML
    )

    INSERT INTO #WorkingTable
    SELECT * FROM OPENROWSET (BULK 'D:\XML_File.xml', SINGLE_BLOB) AS data

    DECLARE @XML AS XML, @docHandle AS INT

    SET @XML = (SELECT COLUMN1 FROM #WorkingTable)

    EXEC sp_xml_preparedocument @docHandle OUTPUT, @XML

    SELECT *
    FROM OPENXML(@docHandle, 'Root/Node-1',2 )
    WITH 
    (
        Head_Name VARCHAR(255) 'Attribute["Name"] [3]/text()',
        Type VARCHAR(255) '../Node-3/Sub-Node-3/Node-1/Attribute["Name"] [1]/text()',
        Name VARCHAR(255) '../Node-3/Sub-Node-3/Node-1/Attribute["Name"] [5]/text()'
    )

    EXEC sp_xml_removedocument @docHandle

    DROP TABLE #WorkingTable

Хотя я получаю результат, но я получаю его только для одного узла. Я хочу результат для полных узлов.


И используя value() метод как:

CREATE TABLE #WorkingTable
(
    COLUMN1 XML
)
INSERT INTO #WorkingTable(COLUMN1) SELECT * FROM OPENROWSET (BULK 'D:\Xml_File.xml', SINGLE_BLOB) AS DATA
DECLARE @XML AS XML
SET @XML = (SELECT COLUMN1 FROM #WorkingTable)

SELECT col.value('Attribute ["Name"] [5]/text()', 'VARCHAR(255)'),
    col.value('../Node-3/Sub-Node-3/Node-1/Attribute["Name"] [4]/text()','VARCHAR(255)')
FROM @XML.nodes('Root/Node-1') AS ref(col)

DROP TABLE #WorkingTable

Но это дает мне эту ошибку:

Сообщение 2203, Уровень 16, Состояние 1, Строка 11 XQuery [value ()]: в качестве предикатов допускаются только выражения 'http://www.w3.org/2001/XMLSchema#decimal?',' http://www.w3.org/2001/XMLSchema#boolean?' или 'node () *', найдено 'xs: string'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...