簡體   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