繁体   English   中英

如何从xml字段中提取值

[英]How to extract value from xml field

我有一个带有xml的字段,如下所示:

<ApplicationProductFields>
  <string>
    <field name="Tech_LoginUzytkownika">lechowski</field>
  </string>
  <int />
  <decimal />
  <bool />
  <datetime />
  <appendix />
  <enum />
  <complex>
    <field name="danePrzesylki">
      <fv>
        <rodzajPrzesylki>sPP</rodzajPrzesylki>
        <dataWplywu>d08/24/2016 00:00:00</dataWplywu>
        <nadawcaNazwisko>sKowalski</nadawcaNazwisko>
        <dokumenty>
          <tytulDokumentu>sDokument testowy 45</tytulDokumentu>
          <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>

我需要将所有值插入不同的表格字段中,例如。

|rodzajPrzesylki|     dataWplywu     |nadawcaNazwisko|  tytulDokumentu  |...
|      sPP      |d08/24/2016 00:00:00|   sKowalski   |sDokument testowy |...

我发现这个SQL查询SQL查询:

SELECT 
col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int')
FROM tbl

但是我不知道如何在我的xml结构中使用它。

有人帮我吗?

您发现的是XPath 这种在XML上运行的查询语言具有相当简单的语法,您在其中描述从XML文档访问节点所需的路径。 它是由w3c定义的 ,而MDN在以更易于访问的方式对其进行记录方面做得很好。

我将让您检查文档,并为您的rodzajPrzesylki字段提供XPath示例:

/ApplicationProductFields/complex/field[name="danePrzesylki"]/fv/rodzajPrzesylki

如果此XML及其生成受您控制,则应考虑一下:

  1. XML生成不正确。 XML中的日期/时间值应遵循ISO8601 ...您必须手动将其转换。

  2. 我认为,第一个字母(“ sPP”或“ d08 / 24 ...”)有点像数据类型标记(字符串和日期),这是非常不专业的...如果您想标记此标记,更好使用类型属性或模式...

您提供的XML并不完整(我不得不用一些标签关闭XML),也没有显示目标表的结构。 无论如何:要做的第一件事是切碎XML。 这将创建一个派生表 在我的示例中,我将使用CTESELECT语句提供此表。 最后,您会看到SELECT * FROM CTE; 这将提供结果集,就好像它是从普通表中获取的一样:

DECLARE @xml XML=
N'<ApplicationProductFields>
  <string>
    <field name="Tech_LoginUzytkownika">lechowski</field>
  </string>
  <int />
  <decimal />
  <bool />
  <datetime />
  <appendix />
  <enum />
  <complex>
    <field name="danePrzesylki">
      <fv>
        <rodzajPrzesylki>sPP</rodzajPrzesylki>
        <dataWplywu>d08/24/2016 00:00:00</dataWplywu>
        <nadawcaNazwisko>sKowalski</nadawcaNazwisko>
        <dokumenty>
          <tytulDokumentu>sDokument testowy 45</tytulDokumentu>
          <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>
        </dokumenty>
      </fv>
    </field>
  </complex>
</ApplicationProductFields>';

-查询

WITH CTE AS
(
    SELECT fld.value(N'@name','nvarchar(max)') AS FieldName
          ,fld.value(N'(fv/rodzajPrzesylki)[1]','nvarchar(max)') AS rodzajPrzesylki
          ,fld.value(N'(fv/dataWplywu)[1]','nvarchar(max)') AS dataWplywu
          ,fld.value(N'(fv/nadawcaNazwisko)[1]','nvarchar(max)') AS nadawcaNazwisko
          ,fld.value(N'(fv/dokumenty/tytulDokumentu)[1]','nvarchar(max)') AS tytulDokumentu
          ,fld.value(N'(fv/dokumenty/dataUtworzenia)[1]','nvarchar(max)') AS dataUtworzenia
    FROM @xml.nodes(N'/ApplicationProductFields/complex/field') AS A(fld)
)
SELECT * FROM CTE;

像这样放些东西

INSERT INTO MyTargetTable(FieldName, rodarodzajPrzesylki, ...)
SELECT FieldName,rodzajPrzesylki,... 
FROM CTE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM