![](/img/trans.png)
[英]How do I set the xmlns attribute on the root element in the generated XML by using T-SQL's xml data type method: query?
[英]How to parse xml tags with multiple xmlns attribute?
我有一个xml值。 我试着解析这个,但结果是null My Xml
<DataPDU xmlns="urn:cma:stp:xsd:stp.1.0">
<Body>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
<Fr>
<FIId>
<FinInstnId>
<ClrSysMmbId>
<MmbId>4588745121</MmbId>
</ClrSysMmbId>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<ClrSysMmbId>
<MmbId>3501548751245701797</MmbId>
</ClrSysMmbId>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>Pac.Convert</BizMsgIdr>
<MsgDefIdr>Pac.Convert.2019</MsgDefIdr>
<BizSvc>Line</BizSvc>
<CreDt>2019-06-07T17:06:35.38Z</CreDt>
</AppHdr>
</Body>
</DataPDU>
我的查询解析工作良好没有属性但返回属性null我的查询:
Select
x.XmlCol.value(N'(./Fr/FIId/FinInstnId/ClrSysMmbId/MmbId)[1]','nvarchar(200)') as FR_MmbId, --Идентификация устанавливается со стороны отправителя
x.XmlCol.value(N'(./To/FIId/FinInstnId/ClrSysMmbId/MmbId)[1]','nvarchar(200)') as TO_MmbId,
x.XmlCol.value(N'(./BizMsgIdr)[1]','nvarchar(200)') as BizMsgIdr
from @Xml.nodes(N'/DataPDU/Body/AppHdr') x(XmlCol)
涉及两个名称空间。 两者都没有前缀,因此显示为默认命名空间 。 所有值都存在于内部默认命名空间中 。 因此,为了保持简单,我建议使用外部的前缀。 这允许您在没有前缀的情况下处理所有内部元素:
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01'
,'urn:cma:stp:xsd:stp.1.0' AS ns)
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'/ns:DataPDU/ns:Body/AppHdr') A(AppHdr);
此外,您可以省略外部命名空间并使用通配符:
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01')
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'/*:DataPDU/*:Body/AppHdr') A(AppHdr);
并且在开头使用双斜杠的深度搜索也会起作用(只要XML中只有一个<AppHdr>
元素)。
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01')
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'//AppHdr') A(AppHdr);
只是为了好玩:这也有效(使用给定的XML, 不建议这样做 ):
SELECT @xml.value(N'(//*:Fr//*:MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,@xml.value(N'(//*:To//*:MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,@xml.value(N'(//*:BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
甚至这个工作(使用给定的XML, 不建议这样做 ):-)
SELECT @xml.value(N'(//*:Fr)[1]','nvarchar(200)') as FR_MmbId
,@xml.value(N'(//*:To)[1]','nvarchar(200)') as TO_MmbId
,@xml.value(N'(//*:BizMsgIdr)[1]','nvarchar(200)') as BizMsgIdr
一般建议是:尽可能具体。 这有助于避免名称冲突,并且性能更好。
您需要在不同的节点中处理XMLNAMESPACES(xmlns)以获得所需的输出。 请尝试以下方式 -
;WITH XMLNAMESPACES(
'urn:cma:stp:xsd:stp.1.0' AS N1,
'urn:iso:std:iso:20022:tech:xsd:head.001.001.01' AS N2,
DEFAULT 'urn:cma:stp:xsd:stp.1.0'
)
Select
x.XmlCol.value(N'(./N2:Fr/N2:FIId/N2:FinInstnId/N2:ClrSysMmbId/N2:MmbId)[1]','nvarchar(200)') as FR_MmbId, --Идентификация устанавливается со стороны отправителя
x.XmlCol.value(N'(./N2:To/N2:FIId/N2:FinInstnId/N2:ClrSysMmbId/N2:MmbId)[1]','nvarchar(200)') as TO_MmbId,
x.XmlCol.value(N'(./N2:BizMsgIdr)[1]','nvarchar(200)') as BizMsgIdr
from @Xml.nodes(N'/N1:DataPDU/Body/N2:AppHdr') x(XmlCol)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.