我有如下所示的XML。我想使用openxml
阅读XML属性和元素,请帮助我吗?
<Report>
<Datapoints>
<Datapoint>10</Datapoint>
<Datapoint>11</Datapoint>
</Datapoints>
<Filters>
<Filter Id="5" FilterTypeId="4">
<Option2>21</Option2>
<Option2>22</Option2>
<Option2>23</Option2>
</Filter>
<Filter Id="6" FilterTypeId="4">
<Option2>21</Option2>
<Option2>22</Option2>
<Option2>23</Option2>
</Filter>
</Filters>
</Report>
我想阅读标记Filter
(Id
和FilterTypeId
)中的属性以及元素option2
。
答案 0 :(得分:2)
为什么OPENXML
??看起来过于笨重且难以使用 - 在SQL Server中使用XPath / XQuery功能!
尝试这样的事情:
DECLARE @input XML = '<Report>
<Datapoints>
<Datapoint>10</Datapoint>
<Datapoint>11</Datapoint>
</Datapoints>
<Filters>
<Filter Id="5" FilterTypeId="4">
<Option2>21</Option2>
<Option2>22</Option2>
<Option2>23</Option2>
</Filter>
<Filter Id="6" FilterTypeId="4">
<Option2>21</Option2>
<Option2>22</Option2>
<Option2>23</Option2>
</Filter>
</Filters>
</Report>'
SELECT
Filter.value('(@Id)[1]', 'int') AS 'FilterID',
Filter.value('(@FilterTypeId)[1]', 'int') AS 'FilterTypeID',
Opt2.value('(.)[1]', 'varchar(50)') AS 'Option2'
FROM
@input.nodes('/Report/Filters/Filter') AS Rep(Filter)
CROSS APPLY
Filter.nodes('Option2') AS Rep2(Opt2)
这应该给你一个类似的输出:
FilterID FilterTypeID Option2
5 4 21
5 4 22
5 4 23
6 4 21
6 4 22
6 4 23
基本上,首次使用.nodes()
(别名为Rep(Filter)
)将创建所有<Filter>
XML标记的“伪表”(每个XML标记一行)并且SELECT
中的前两项是从每个<Filter>
XML标记中获取属性。
然后,您需要在每个过滤器中包含所有<Option2>
个元素的第二个枚举 - 这是第二个.nodes()
调用正在执行的操作 - 基于第一个伪表中的过滤器XML标记。然后,它只输出XML标记的内容作为其值。