簡體   English   中英

如何應用XML命名空間

[英]How to apply XML Namespaces

我正在嘗試從SOAP API解析一些xml。 我對XML還是很陌生,但是當我只有該語句的主體時,我可以使它工作。 我曾嘗試應用一些簡單的名稱空間,但不確定這是否是正確的方法。

DECLARE @XmlFile XML = 
'<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <Account_GetDataArrayResponse xmlns="http://e-conomic.com">
            <Account_GetDataArrayResult>
                <AccountData>
                    <Handle>
                        <Number>1000</Number>
                    </Handle>
                    <Number>1000</Number>
                    <Name>RESULTATOPGØRELSE</Name>
                    <Type>Heading</Type>
                    <DebitCredit>Debit</DebitCredit>
                    <IsAccessible>true</IsAccessible>
                    <BlockDirectEntries>false</BlockDirectEntries>
                    <Balance>0.00</Balance>
                </AccountData>
                <AccountData>
                    <Handle>
                        <Number>1001</Number>
                    </Handle>
                    <Number>1001</Number>
                    <Name>Omsætning</Name>
                    <Type>Heading</Type>
                    <DebitCredit>Debit</DebitCredit>
                    <IsAccessible>true</IsAccessible>
                    <BlockDirectEntries>false</BlockDirectEntries>
                    <Balance>0.00</Balance>
                </AccountData>
            </Account_GetDataArrayResult>
        </Account_GetDataArrayResponse>
    </soap:Body>
</soap:Envelope>'

;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema' AS e) 


SELECT
    AccountHandleNumber = AccountData.value('(Handle/Number)[1]', 'int')
    ,AccountName = AccountData.value('(Name)[1]', 'varchar(20)')
    ,AccountNumber = AccountData.value('(Number)[1]', 'int')
    ,AccountType = AccountData.value('(Type)[1]','varchar(20)')
    ,AccountDebitCredit = AccountData.value('(DebitCredit)[1]', 'varchar(20)')
    ,AccountIsAccessible = AccountData.value('(IsAccessible)[1]', 'varchar(20)')
    ,AccountBlockDirectEntries = AccountData.value('(BlockDirectEntries)[1]', 'varchar(20)')
    ,AccountBalance = AccountData.value('(Balance)[1]', 'float')
FROM  @XMLFile.nodes('/Account_GetDataArrayResponse/Account_GetDataArrayResult/AccountData') AS XTbl(AccountData)

是的,這是非常正確的方法!

但是,您並沒有閱讀到您擁有的整個XML-您必須真正從根節點開始-因此請嘗試像這樣修改代碼:

;WITH XMLNAMESPACES('http://schemas.xmlsoap.org/soap/envelope/' AS e, 
                    DEFAULT 'http://e-conomic.com') 
SELECT
    AccountHandleNumber = AccountData.value('(Handle/Number)[1]', 'int')
    ..... 
FROM  
    @XMLFile.nodes('/e:Envelope/e:Body/Account_GetDataArrayResponse/Account_GetDataArrayResult/AccountData') AS XTbl(AccountData)

首先-您還需要在文檔的開始部分照顧<soap:Envelope><soap:Body>標記-您已經為此創建了XML命名空間別名e因此您需要包括/e:Envelope/e:Body.nodes()調用中XPath表達式的.nodes()

另外: <Account_GetDataArrayResponse>節點聲明了另一個XML名稱空間,該名稱空間將在整個XML文檔的其余部分中應用-我已將其作為DEFAULT XML名稱空間添加到查詢中,因此它將被應用於XPath表達式中不包含該名稱空間的任何節點。沒有與之關聯的顯式XML名稱空間前綴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM