如何将 XML 文件加载到 SQL

问题描述

我正在尝试将 XML 文件加载到 sql Server,但我什么也没收到 这是我的 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="master-catalog-sso-us">
    <header>
        <image-settings>
            <internal-location base-path="/"/>
            <view-types>
                <view-type>large</view-type>
                <view-type>medium</view-type>
                <view-type>small</view-type>
                <view-type>swatch</view-type>
            </view-types>
            <alt-pattern>${productname}</alt-pattern>
            <title-pattern>${productname}</title-pattern>
        </image-settings>
    </header>

    <category category-id="root">
        <display-name xml:lang="x-default">root Category</display-name>
        <description xml:lang="x-default">root Category</description>
        <online-flag>true</online-flag>
        <template/>
        <page-attributes/>
        <refinement-deFinitions>
            <refinement-deFinition type="attribute" bucket-type="none" attribute-id="shops" system="false">
                <display-name xml:lang="x-default">Shops</display-name>
                <value-set>search-result</value-set>
                <sort-mode>value-name</sort-mode>
                <sort-direction>ascending</sort-direction>
                <cutoff-threshold>5</cutoff-threshold>
            </refinement-deFinition>
        </refinement-deFinitions>
    </category>

    <category category-id="default">
        <display-name xml:lang="x-default">default Category</display-name>
        <description xml:lang="x-default">default Category</description>
        <online-flag>true</online-flag>
        <parent>root</parent>
        <template/>
        <page-attributes/>
    </category>

    <product product-id="0217328320-sso-us">
        <ean/>
        <upc/>
        <unit/>
        <min-order-quantity>1</min-order-quantity>
        <step-quantity>1</step-quantity>
        <display-name xml:lang="x-default">Magnetibook - 4 Seasons</display-name>
        <long-description xml:lang="x-default">48 magnets that stick to the Metallic &amp;#34;canvas&amp;#34; where your child can choose between any of the four season &amp;#34;back drops&amp;#34; and then pick out the appropriate outfits and dress the family for a day outside. Comes in a magnetic closing &amp;#34;book&amp;#34; for safe keeping and easy storage.</long-description>
        <store-force-price-flag>false</store-force-price-flag>
        <store-non-inventory-flag>false</store-non-inventory-flag>
        <store-non-revenue-flag>false</store-non-revenue-flag>
        <store-non-discountable-flag>false</store-non-discountable-flag>
        <online-flag>true</online-flag>
        <online-from>2017-01-01T05:00:00.000Z</online-from>
        <available-flag>true</available-flag>
        <searchable-flag>false</searchable-flag>
        <tax-class-id>standard</tax-class-id>
        <brand>Janod</brand>
        <manufacturer-name>Juratoys Company</manufacturer-name>
        <sitemap-included-flag site-id="rco-us">true</sitemap-included-flag>
        <sitemap-changefrequency site-id="rco-us">weekly</sitemap-changefrequency>
        <sitemap-priority site-id="rco-us">1.0</sitemap-priority>
        <page-attributes/>
        <custom-attributes>
        <custom-attribute attribute-id="ID">6339080</custom-attribute>

如何将该 ID 字段加载到 sql 中?我试过这个: 但我相信我的交叉应用 c.nodes 是错误的!我应该使用哪些标记? 谢谢

SELECT a.id.query('id').value('.','varchar(50)') as id FROM 
( SELECT CAST(C AS XML) FROM OPENROWSET (BULK '\\test\master.xml',SINGLE_BLOB ) as T(c)  ) AS S(c)
cross apply c.nodes('product/id') as A(id)

解决方法

你可以试试这个:

SELECT c.id.query('id').value('.','varchar(50)') as id FROM 
( SELECT CAST(C AS XML) FROM OPENROWSET (BULK '\\test\master.xml',SINGLE_BLOB ) as T(c)  ) AS T(c)
cross apply c.nodes('product/id') as c(id)

但是在您的共享 xml 中找不到产品标签中的 id 标签。

我在这里分享一个例子:

XML 文件内容:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer>
    <Document>000 000 000</Document>
    <Name>Mary Angel</Name>
    <Address>Your City,YC 1212</Address>
    <Profession>Systems Analyst</Profession>
  </Customer>
  <Customer>
    <Document>000 000 001</Document>
    <Name>John Lenon</Name>
    <Address>Your City,YC 1212</Address>
    <Profession>Driver</Profession>
  </Customer>
  <Customer>
    <Document>000 000 002</Document>
    <Name>Alice Freeman</Name>
    <Address>Your City,YC 1212</Address>
    <Profession>Architect</Profession>
  </Customer>
  <Customer>
    <Document>000 000 003</Document>
    <Name>George Sands</Name>
    <Address>Your City,YC 1212</Address>
    <Profession>Doctor</Profession>
  </Customer>
  <Customer>
    <Document>000 000 004</Document>
    <Name>Mark Oliver</Name>
    <Address>Your City,YC 1212</Address>
    <Profession>Writer</Profession>
  </Customer>
</Customers>

将以上内容复制并保存为d盘的xml文件,命名为testxmlfile.xml

然后尝试以下查询:

SELECT
   MY_XML.Customer.query('Document').value('.','VARCHAR(20)') Document,MY_XML.Customer.query('Name').value('.','VARCHAR(50)') Name,MY_XML.Customer.query('Address').value('.','VARCHAR(50)')Address,MY_XML.Customer.query('Profession').value('.','VARCHAR(50)' )Profession
FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK 'd:\testxmlfile.xml',SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes('Customers/Customer') AS MY_XML (Customer);

输出:

Document    Name            Address             Profession
000 000 000 Mary Angel      Your City,YC 1212  Systems Analyst
000 000 001 John Lenon      Your City,YC 1212  Driver
000 000 002 Alice Freeman   Your City,YC 1212  Architect
000 000 003 George Sands    Your City,YC 1212  Doctor
000 000 004 Mark Oliver     Your City,YC 1212  Writer
,

您还不清楚您到底想要什么,但看起来您想要属性 product-id 来自这里:

    <product product-id="0217328320-sso-us">

您还没有考虑命名空间,需要添加。

还不清楚您是否有多个 product 节点。如果你这样做,那么你需要这个

WITH XMLNAMESPACES (DEFAULT 'http://www.demandware.com/xml/impex/catalog/2006-10-31')
SELECT A.product.value('@product-id','varchar(50)') as id
FROM 
( SELECT CAST(C AS XML)
  FROM OPENROWSET (BULK '\\test\master.xml',SINGLE_BLOB ) as T(c)
) AS S(c)
cross apply S.c.nodes('/catalog/product') as A(product)

如果您只有一个 product 节点,那么您根本不需要 .values

WITH XMLNAMESPACES (DEFAULT 'http://www.demandware.com/xml/impex/catalog/2006-10-31')
SELECT S.c.value('/catalog/product/@product-id','varchar(50)') as id FROM 
FROM 
( SELECT CAST(C AS XML)
  FROM OPENROWSET (BULK '\\test\master.xml',SINGLE_BLOB ) as T(c)
) AS S(c)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...