Sql-Server

TSQL (2014) - 導入帶有重音符號和標點符號的 XML

  • October 3, 2017

使用 Forrest 的這個解決方案:

DECLARE @XML xml = 
'<?xml version="1.0" encoding="UTF-8"?>
  <Orders>
   <Order>
       <OrderID>334</OrderID>
       <AmountPaid currencyID="EUR">17.10</AmountPaid>
       <UserID>marc58</UserID>
       <ShippingAddress>
           <Name>Marc Juppé</Name>
           <Address>Rue  garçonneé III° arrondissement</Address>
           <City>Paris</City>
           <StateOrProvince></StateOrProvince>
           <Country>FR</Country>
           <Phone>333333333</Phone>
           <PostalCode>22222</PostalCode>
        </ShippingAddress>
        <ShippingCosts>4.50</ShippingCosts>
        <Items>
           <Item>
              <Details>
                   <ItemID>3664</ItemID>
                   <Store>47</Store>
                   <Title>MCPU DDA010</Title>
                   <SKU>mmx</SKU>
               </Details>
               <Quantity>1</Quantity>
               <Price currencyID="EUR">6.2</Price>
           </Item>
           <Item>
              <Details>
                   <ItemID>3665</ItemID>
                   <Store>45</Store>
                   <Title>MCPU DFZ42</Title>
                   <SKU>mmy</SKU>
               </Details>
               <Quantity>2</Quantity>
               <Price currencyID="EUR">3.2</Price>
           </Item>
       </Items>
   </Order>
</Orders>'

SELECT 
   x.value('./ItemID[1]','int') AS ItemID,
   x.value('./Store[1]','int') AS Store,
   x.value('./Title[1]','nvarchar(100)') AS Title,
   x.value('./SKU[1]','nvarchar(100)') AS SKU,
   x.value('../Quantity[1]','int') AS Qty,
   x.value('../Price[1]','decimal(11,2)') AS Price,
   x.query('//OrderID[1]').value('.','int') AS OrderID,
   x.query('//AmountPaid[1]').value('.','decimal(11,2)') AS AmountPaid,
   x.query('//UserID[1]').value('.','nvarchar(100)') AS UserID,
   x.query('//ShippingCosts[1]').value('.','decimal(11,2)') AS ShippingCosts
FROM @XML.nodes('//Item/Details') i(x)

我收到一個錯誤,例如

XML 解析:第 162 行,第 34 個字元,非法 xml 字元

當需要解析包含重音字元(àèòìùé)或°的欄位時

我嘗試轉換éintè但收到此錯誤:

XML 解析:第 162 行,字元 41,格式良好的檢查:未聲明的實體

而如果我轉換為è它有效。

問題是我無法對 XML 文件進行 HTMLEncode,因為我希望它還會轉換 XML 結構的所有“<”和“>”,並且可能還會轉換其他內容。

可以建議在解析之前對 XML 進行 HTMLEncode 的最佳解決方案嗎?

您擁有的 XML 在 UTF-8 編碼中無效。需要對重音字元進行編碼。例如°應該編碼為°.

這是一個較短的版本,也失敗了。

declare @X xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;°';
select @X.value('text()[1]', 'nchar(1)');

消息 9420,級別 16,狀態 1,第 1 行 XML 解析:第 1 行,字元 39,非法 xml 字元

如果您使用 UTF-8,則應該是這樣。

declare @X xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;°';
select @X.value('text()[1]', 'nchar(1)');

您需要將數據的來源追溯到生產者,以查看您最終在哪裡得到了無效的 XML。

引用自:https://dba.stackexchange.com/questions/187492