gpt4 book ai didi

xml - 如何在不使用 SQL Server 中的 XQuery 对元素名称进行硬编码的情况下从 XML 中提取值?

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:27 25 4
gpt4 key购买 nike

我将 xml 存储在一个表中,表中包含我感兴趣的元素的名称/路径。

我想在不硬编码路径和/或元素名称的情况下提取这些元素的值。我的 xml 结构不会改变,它总是有父/子/元素。

是否可以将 xml 和 table 连接起来以获取元素的值?

下面是我能够得到的例子。我认为可以将此解决方案扩展到 ChildNode 和 Element 上的 JOIN 但不确定如何使用 .query().value() 获取 ChildNode 和 Element .

感谢您的帮助。

DECLARE @xml xml
SET @xml =
'<Products>
<RedProduct>
<Details_RedProduct>
<Width>1</Width>
<Depth>2</Depth>
<Weight>3</Weight>
</Details_RedProduct>
</RedProduct>
<GreenProduct>
<Details_GreenProduct>
<Width>4</Width>
<Depth>5</Depth>
<Height>6</Height>
</Details_GreenProduct>
</GreenProduct>
<BlueProduct>
<Details_BlueProduct>
<Width>7</Width>
<Depth>8</Depth>
<Lenght>9</Lenght>
</Details_BlueProduct>
</BlueProduct>
</Products>'

DECLARE @ProductElement table (ProductNode nvarchar(100), ChildNode nvarchar(100), Element nvarchar(20))
INSERT INTO @ProductElement SELECT 'RedProduct','','Width'
INSERT INTO @ProductElement SELECT 'GreenProduct','','Width'
INSERT INTO @ProductElement SELECT 'GreenProduct','','Height'
UPDATE @ProductElement SET ChildNode = 'Details_' + ProductNode

SELECT ProductsCollection.query('local-name(.)').value('.','nvarchar(100)') as TestOutput
FROM @xml.nodes('//Products/*') productsXml (ProductsCollection)
INNER JOIN @ProductElement el ON el.ProductNode = ProductsCollection.query('local-name(.)').value('.','nvarchar(100)')

最佳答案

您可以使用 sql:column()在您的 xquery 表达式中并与 local-name(.) 进行比较以获得您想要的节点。

select PE.ProductNode,
PE.ChildNode,
PE.Element,
T.Col.value('.', 'int') as ElementValue
from @ProductElement as PE
cross apply @xml.nodes('/Products/*[local-name(.) = sql:column("PE.ProductNode")]
/*[local-name(.) = sql:column("PE.ChildNode")]
/*[local-name(.) = sql:column("PE.Element")]') as T(Col)

结果:

ProductNode          ChildNode            Element              ElementValue
-------------------- -------------------- -------------------- ------------
RedProduct Details_RedProduct Width 1
GreenProduct Details_GreenProduct Width 4
GreenProduct Details_GreenProduct Height 6

编辑:另一个使用字段连接的版本。根据您的数据情况,它可能对您有更好的性能。第一个版本为 @ProductElement 中的每一行解析 XML,第二个版本分解 XML 并使用它来加入 @ProductElement。

select PE.ProductNode,
PE.ChildNode,
PE.Element,
X.ElementValue
from @ProductElement as PE
inner join (
select T1.Col.value('local-name(.)', 'varchar(100)') as ProductNode,
T2.Col.value('local-name(.)', 'varchar(100)') as ChildNode,
T3.Col.value('local-name(.)', 'varchar(100)') as Element,
T3.Col.value('.', 'varchar(100)') as ElementValue
from @xml.nodes('/Products/*') as T1(Col)
cross apply T1.Col.nodes('*') as T2(Col)
cross apply T2.Col.nodes('*') as T3(Col)
) as X
on PE.ProductNode = X.ProductNode and
PE.ChildNode = X.ChildNode and
PE.Element = X.Element

关于xml - 如何在不使用 SQL Server 中的 XQuery 对元素名称进行硬编码的情况下从 XML 中提取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com