【问题标题】:How to read formated xml file in SQL Server如何在 SQL Server 中读取格式化的 xml 文件
【发布时间】:2017-01-28 02:42:48
【问题描述】:

我有一个 XML 文件,需要 SQL Server 2008 从中读取一些数据。

请指导我解决这个问题。

我的 XML 文件是这样的:

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="CI_CODE" type="xs:decimal" minOccurs="0" />
                <xs:element name="CI_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="CI_PISH_CODE" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
      <Table diffgr:id="Table1" msdata:rowOrder="0">
        <CI_CODE>1</CI_CODE>
        <CI_NAME>Kerman</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table2" msdata:rowOrder="1">
        <CI_CODE>2</CI_CODE>
        <CI_NAME>Anar</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table3" msdata:rowOrder="2">
        <CI_CODE>3</CI_CODE>
        <CI_NAME>Baft</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

我需要帮助在 SQL Server 2008 中阅读此 XML。

我需要标签 &lt;CI_CODE&gt;&lt;CI_NAME&gt;&lt;CI_PISH_CODE&gt; 数据。

请指导我

【问题讨论】:

标签: sql sql-server xml import xml-parsing


【解决方案1】:

假设您的 XML 存储在名为 @Data XML 的变量中,您可以使用此 XQuery 获取您的数据。

XPath 表达式沿节点树“导航”,为您提供 XML 片段的“虚拟”表 - 每个 &lt;Table&gt; XML 元素对应一个。然后,您可以从该 XML 元素中使用 .value() XQuery 表达式获取各个数据项。

您需要特别注意为每个元素使用正确 XML 命名空间。

;WITH XMLNAMESPACES('http://tempuri.org/' AS ns, 
                    'urn:schemas-microsoft-com:xml-diffgram-v1' AS dg)
SELECT
    CI_CODE = XC.value('(CI_CODE)[1]', 'int'),
    CI_NAME = XC.value('(CI_NAME)[1]', 'varchar(50)'),
    CI_PISH_CODE = XC.value('(CI_PISH_CODE)[1]', 'int')
FROM
    @Data.nodes('/ns:DataSet/dg:diffgram/NewDataSet/Table') AS XT(XC)

这会在我的电脑上产生这个输出:

【讨论】:

    【解决方案2】:

    总的来说,我建议您尽可能具体。在这种情况下,您有不干净的命名空间(schema 级别的空默认命名空间),这使得正确查询变得困难。

    试试通配符命名空间 (*:):

    编辑:简化

    --你的 XML 在一个变量中

    DECLARE @xml XML=
    'Copy your XML here';
    

    --查询

    SELECT dgt.value('(@*:id)[1]','nvarchar(max)') AS DiffgramTable
          ,dgt.value('(*:CI_CODE)[1]','int') AS Diffgram_CI_CODE
          ,dgt.value('(*:CI_NAME)[1]','nvarchar(max)') AS Diffgram_CI_NAME
          ,dgt.value('(*:CI_PISH_CODE)[1]','int') AS Diffgram_CI_CODE
    FROM @xml.nodes('/*:DataSet') AS A(ds)
    OUTER APPLY ds.nodes('*:diffgram') AS C(dg)
    OUTER APPLY dg.nodes('*:NewDataSet/*:Table') AS D(dgt)
    

    首先我们选择“DataSet”并将其命名为“ds”。下面我们选择“diffgram”(“dg”)。在“dg”下面我们选择所有“Table”(“dgt”)

    select会从最近的节点中读取所有信息

    结果

    +---------------+------------------+------------------+------------------+
    | DiffgramTable | Diffgram_CI_CODE | Diffgram_CI_NAME | Diffgram_CI_CODE |
    +---------------+------------------+------------------+------------------+
    | Table1        | 1                | Kerman           | 34               |
    +---------------+------------------+------------------+------------------+
    | Table2        | 2                | Anar             | 34               |
    +---------------+------------------+------------------+------------------+
    | Table3        | 3                | Baft             | 34               |
    +---------------+------------------+------------------+------------------+
    

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多