繁体   English   中英

如何使用多个xmlns属性解析xml标记?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM