【问题标题】:Issue converting special characters from SQL to XML using XML PATH使用 XML PATH 将特殊字符从 SQL 转换为 XML 的问题
【发布时间】:2019-07-31 04:10:12
【问题描述】:

在尝试将某些特殊字符转换为正确的 XML 时遇到问题。相反,它返回的是调用应用程序失败的 XML。

这是一大段代码的一部分。我必须使用 XML PATH,否则将需要重构整个过程,这超出了本工作的范围。

我尝试替换这些值,并尝试替换前后的值。我无法对后续返回的 XML 执行额外的传递

    DROP TABLE IF EXISTS #MyData
    GO

    CREATE TABLE #MyData
    (
       RefId varchar(20) NOT NULL,
       Company varchar(255) NOT NULL
    );
    GO

    INSERT INTO #MyData (RefId, Company) VALUES ('SN7172', 'Goodle '+CHAR(0174));
    INSERT INTO #MyData (RefId, Company) VALUES ('GW5282', 'NewtownApple '+CHAR(0169));
    INSERT INTO #MyData (RefId, Company) VALUES ('ZE0018', 'Curlewky Appliances '+CHAR(0151));
    INSERT INTO #MyData (RefId, Company) VALUES ('TW1037', 'Sparky Games '+CHAR(0153));
    GO

    SELECT (
        SELECT RefId, 
            REPLACE(REPLACE(REPLACE(REPLACE(Company, char(0174),'&#0174'),     char(0169),'&#0169'), char(0153),'&#0153'), char(0151),'&#0151') Company
        FROM #MyData
        FOR XML PATH('Catalog'), TYPE
    )
    FOR XML PATH('Catalogs'), TYPE

SQL 正在转换为 ® 而不是 ® 然而,下面的 XML 显示了正在转换的 & 符号,而不是完整的字符串。

    <Catalog>
        <RefId>GW5282</RefId>
        <Company>Newtown &amp; Apple &amp;#0169;</Company>
    </Catalog>
    <Catalog>
        <RefId>ZE0018</RefId>
        <Company>Curlewky Appliances &amp;#0151;</Company>
    </Catalog>
    <Catalog>
        <RefId>TW1037</RefId>
        <Company>Sparky Games &amp;#0153;</Company>
    </Catalog>
    </Catalogs>

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    我理解正确吗?您的 SQL-Server 生成的 XML 是正确的(类似于 &lt;Company&gt;NewtownApple ©&lt;/Company&gt;),但您的消费者无法处理 ©,因此您想改用实体。正确的?

    一种技巧可能是转换生成的 XML 并在字符串基础上进行替换:

    SELECT REPLACE(REPLACE(REPLACE(REPLACE(CAST(
    (
        SELECT (
            SELECT RefId, Company
            FROM #MyData
            FOR XML PATH('Catalog'), TYPE
        )
        FOR XML PATH('Catalogs'), TYPE) AS nvarchar(MAX)), char(0174),'&#0174;'),     char(0169),'&#0169;'), char(0153),'&#0153;'), char(0151),'&#0151;');
    

    但不要尝试将结果转换回 XML。你会得到特殊字符...

    【讨论】:

    • 谢谢。它将它们转换回来,因为该列是 XML。呃
    • @AllanL,SQL-Server 中的 XML 是正确的,恐怕问题出在您的消费者方面……唯一的出路似乎是字符串路由。重要须知:XML 不存储为您看到的字符串,而是存储为层次结构表。您看到的 XML 会在您请求时重新创建。而且几乎没有机会告诉 SQL-Server 如何处理特殊字符。您可能会阅读有关 &lt;!DOCTYPE&gt; 和自定义实体(例如 &lt;!DOCTYPE myEntities [&lt;!ENTITY copyright "&amp;#0169;"&gt;]&gt;)的信息。您可以在 XML 中使用 &amp;copyright;。但这也会自动翻译。
    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2011-06-05
    • 2017-07-21
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多