Sql-Server
TSQL (2014) - 導入帶有重音符號和標點符號的 XML
使用 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 = '<?xml version="1.0" encoding="UTF-8"?>°'; select @X.value('text()[1]', 'nchar(1)');
消息 9420,級別 16,狀態 1,第 1 行 XML 解析:第 1 行,字元 39,非法 xml 字元
如果您使用 UTF-8,則應該是這樣。
declare @X xml = '<?xml version="1.0" encoding="UTF-8"?>°'; select @X.value('text()[1]', 'nchar(1)');
您需要將數據的來源追溯到生產者,以查看您最終在哪裡得到了無效的 XML。