[英]XML to SQL - Selecting multiple nodes with the same name
I have working code that can select a few values from an XML file.我有可以从 XML 文件中选择几个值的工作代码。 The problem is that I have multiple nodes with the same name.问题是我有多个同名节点。
Here is a snippet of the XML:这是 XML 的一个片段:
<wd:Report_Data xmlns:wd="urn:com.workday.report/Countries_and_Their_Address_Components_Summary">
<wd:Report_Entry>
<wd:Country wd:Descriptor="Afghanistan">
<wd:ID wd:type="WID">db69b722446c11de98360015c5e6daf6</wd:ID>
<wd:ID wd:type="ISO_3166-1_Alpha-2_Code">AF</wd:ID>
<wd:ID wd:type="ISO_3166-1_Alpha-3_Code">AFG</wd:ID>
<wd:ID wd:type="ISO_3166-1_Numeric-3_Code">4</wd:ID>
</wd:Country>
<wd:Address_Format_Type wd:Descriptor="Basic">
<wd:ID wd:type="WID">4516bf435611423ea4ee72fa842572a0</wd:ID>
</wd:Address_Format_Type>
<wd:Local>1</wd:Local>
<wd:Address_Components>
<wd:Address_Component wd:Descriptor="Address Line 1 - Local">
<wd:ID wd:type="WID">12d859b8df024175a111da2e088250fb</wd:ID>
<wd:ID wd:type="Address_Component_Type_ID">ADDRESS_LINE_1_LOCAL</wd:ID>
</wd:Address_Component>
<wd:Order>a</wd:Order>
<wd:Required>0</wd:Required>
</wd:Address_Components>
<wd:Address_Components>
<wd:Address_Component wd:Descriptor="Address Line 2 - Local">
<wd:ID wd:type="WID">85a6ab9412c44dd9a71a7e4760bf17fb</wd:ID>
<wd:ID wd:type="Address_Component_Type_ID">ADDRESS_LINE_2_LOCAL</wd:ID>
</wd:Address_Component>
<wd:Order>b</wd:Order>
<wd:Required>0</wd:Required>
</wd:Address_Components>
My SQL is the following:我的 SQL 如下:
declare @inputxml table (x xml)
insert @inputxml
select x
from OPENROWSET(BULK 'C:\ParallelTool\addcomp.xml', SINGLE_BLOB) As T(x)
;WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary')
select
xmldata.[ISO], xmldata.[Component 1], xmldata.[Component 2], xmldata.[Required]
into dbo.WD
from @inputxml
cross apply (
select
[ISO] = xmldata.value('(Country/ID)[3]', 'VARCHAR(MAX)'),
[Component 1] = xmldata.value('(Address_Components/Address_Component/ID)[2]', 'VARCHAR(MAX)'),
[Component 2] = xmldata.value('(Address_Components/Address_Component/ID)[2]', 'VARCHAR(MAX)'),
[Required] = xmldata.value('(Address_Components/Required)[1]', 'INT')
from x.nodes('/Report_Data/Report_Entry') Z1(xmldata)
) xmldata
Where I can't get what I need is the [Component 2].我无法得到我需要的是 [组件 2]。 I want to basically select ALL of the "Address_Component_Type_ID" in the file, but they are all named the same and under other nodes that are named the same.我想基本上选择文件中的所有“Address_Component_Type_ID”,但它们的名称都相同,并且在名称相同的其他节点下。 How can I specify in my SQL to grab all of the Component Types?如何在我的 SQL 中指定获取所有组件类型? Thank you for looking!感谢您的关注!
Depends what you want to do... If you know there are exactly 2 "Address_Components" that you want to grab, you can modify your query like so:取决于你想做什么......如果你知道你想要抓取 2 个“Address_Components”,你可以像这样修改你的查询:
;WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary')
select
xmldata.[ISO], xmldata.[Component 1], xmldata.[Component 2], xmldata.[Required]
from @inputxml
cross apply (
select
[ISO] = xmldata.value('(Country/ID)[3]', 'VARCHAR(MAX)'),
[Component 1] = xmldata.value('(Address_Components/Address_Component/ID)[2]', 'VARCHAR(MAX)'),
[Component 2] = xmldata.value('(Address_Components[2]/Address_Component/ID)[2]', 'VARCHAR(MAX)'),
[Required] = xmldata.value('(Address_Components/Required)[1]', 'INT')
from x.nodes('/Report_Data/Report_Entry') Z1(xmldata)
) xmldata
And the results look like this:结果如下所示:
ISO Component 1 Component 2 Required
----- ------------------------- ------------------------- -----------
AFG ADDRESS_LINE_1_LOCAL ADDRESS_LINE_2_LOCAL 0
However, if there can be any number of "Address_Components", and you want to grab them into separate records, you can rewrite your query like this:但是,如果可以有任意数量的“Address_Components”,并且您想将它们抓取到单独的记录中,则可以像这样重写查询:
;WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary')
select
[ISO] = Report_Entry.x.value('(Country/ID)[3]', 'VARCHAR(MAX)')
, [Component] = Address_Components.x.value('(Address_Component/ID)[2]', 'VARCHAR(MAX)')
, [Required] = Address_Components.x.value('(Required)[1]', 'INT')
from @inputxml
cross apply x.nodes('/Report_Data/Report_Entry') Report_Entry(x)
cross apply Report_Entry.x.nodes('./Address_Components') Address_Components (x)
And the results look like this:结果如下所示:
ISO Component Required
----- ------------------------- -----------
AFG ADDRESS_LINE_1_LOCAL 0
AFG ADDRESS_LINE_2_LOCAL 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.