我有一个如下所示的XML。到目前为止,如果A和B节点都在XML中,则可以轻松映射它们的属性,即type="A-type"
和type="B-type"
。
我陷入了<B>
节点可能不存在于XML中的情况,然后我也需要获取<A>
节点属性,即type="A-type"
,但是当前逻辑返回我没有排。请帮助如何实现这一目标。
请注意,<B>
可以多次出现在<A>
下,这就是为什么我们必须使用路径Root/A/B
的原因。由于无法预测<B>
的出现,因此无法更改路径。
示例1(存在<B>
)
DECLARE @myXML XML =
'<Root>
<A type="A-type">
<B type="B-type"></B>
</A>
</Root>'
SELECT
N.value('(../@type)[1]','VARCHAR(100)'),
N.value('(@type)[1]','VARCHAR(100)')
FROM @myXML.nodes('Root/A/B') AS X(N)
示例2(不存在<B>
)
DECLARE @myXML XML =
'<Root>
<A type="A-type">
</A>
</Root>'
SELECT
N.value('(../@type)[1]','VARCHAR(100)'),
N.value('(@type)[1]','VARCHAR(100)')
FROM @myXML.nodes('Root/A/B') AS X(N)
预期输出:
答案 0 :(得分:3)
尝试一下
SELECT
x1.A.value('@type','VARCHAR(100)'),
x2.B.value('@type','VARCHAR(100)')
FROM
@myXML.nodes('/Root/A[1]') AS x1(A)
OUTER APPLY @myXML.nodes('/Root/A[1]/B') AS x2(B)
使用
<Root>
<A type="A-type">
<B type="B-type 1"></B>
<B type="B-type 2"></B>
<B type="B-type 3"></B>
</A>
</Root>
返回
A-type B-type 1 A-type B-type 2 A-type B-type 3
与
<Root>
<A type="A-type">
<B type="B-type"></B>
</A>
</Root>
它返回
A-type B-type
和
<Root>
<A type="A-type">
</A>
</Root>
它返回
A-type NULL