TSQL (2014) - 导入带有重音符号和标点符号的 XML

Joe*_*Joe 3 xml sql-server sql-server-2014

使用 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)
Run Code Online (Sandbox Code Playgroud)

我收到类似的错误

XML 解析:第 162 行,第 34 个字符,非法 xml 字符

当需要解析包含重音字符 (àèòìùé) 或 ° 的字段时

我尝试转换éint&egrave;但收到此错误:

XML 解析:第 162 行,字符 41,格式良好的检查:未声明的实体

而如果我转换为&#232;它的工作原理。

问题是我无法对 XML 文件进行 HTMLEncode,因为我希望它也能转换 XML 结构的所有“<”和“>”,可能还有其他东西。

在解析之前可以建议对 XML 进行 HTMLEncode 的最佳解决方案吗?

Mik*_*son 5

您拥有的 XML 在 UTF-8 编码中无效。需要对重音字符进行编码。例如°应该编码为°.

这是一个较短的版本,也失败了。

declare @X xml = '<?xml version="1.0" encoding="UTF-8"?>°';
select @X.value('text()[1]', 'nchar(1)');
Run Code Online (Sandbox Code Playgroud)

消息 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)');
Run Code Online (Sandbox Code Playgroud)

您需要向后追溯数据源到生产者,以查看最终的无效 XML 的位置。

  • @Joe,不,当您想使用验证输入的 XML 解析器解析无效的 XML 时,没有“非黑客解决方案”。 (2认同)