【问题标题】:How to get SQL query to not escape HTML data returned in query如何让 SQL 查询不转义查询中返回的 HTML 数据
【发布时间】:2009-12-22 17:22:22
【问题描述】:

我有以下 SQL 查询....

select AanID as '@name', '<![CDATA[' + Answer + ']]>' from AuditAnswers for XML PATH('str'), ROOT('root')

效果很好,但“答案”列有时会包含 HTML 标记。该查询会自动从生成的 XML 中的“答案”列中转义此 HTML。我不想那样。我将把这个结果列包装在 CDATA 中,这样就不需要转义了。

我希望结果是这样的......

<str name="2"><![CDATA[<DIV><DIV Style="width:55%;float:left;">Indsfgsdfg]]></str>

而不是这个...

<str name="2">&lt;![CDATA[&lt;DIV&gt;&lt;DIV Style="width:55%;float:left;"&gt;In</str>

是否有功能或其他机制可以做到这一点?

【问题讨论】:

    标签: sql xml sql-server-2005


    【解决方案1】:

    选择任何“FOR XML”会转义任何预先存在的 XML,这样就不会破坏 XmlDocument 的一致性。您给出的第一行示例被认为是格式不正确的 XML,并且无法由 XmlDocument 对象以及大多数解析器加载。我会考虑重组你正在尝试做的事情,以便你可以有一个更有效的解决方案。

    【讨论】:

    • 很高兴知道像其他一些人提到的那样,我正在寻找显式模式。感谢您的信息。
    【解决方案2】:

    您可以使用for xml explicitcdata 指令:

    select
       1 as tag,
       null as parent,
       AanID as [str!1!name],
       Answer as [str!1!!cdata]
    from AuditAnswers
    for xml explicit
    

    【讨论】:

    • 有趣。我没有意识到这一点。这看起来对我有用。
    【解决方案3】:

    您可以指定在使用 EXPLICIT 模式 XML 查询时将输出视为 CDATA。见:

    Using EXPLICIT Mode

    Example: Specifying the CDATA Directive

    【讨论】:

    • 非常感谢您的链接。我不知道显式模式。
    【解决方案4】:

    在数据库输出中使用&lt;[CDATA[ &lt;div&gt;&lt;/div&gt; ]]&gt; 比使用&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; 有什么好处?在我看来,在这两种情况下,您的 XML 输出中都会有一个正确转义的 HTML 片段,并且用一个像样的 XML 解析器读回它应该会在这两种情况下为您提供未转义的原始版本。

    【讨论】:

    • 我不知道有什么好处,也不知道它是否重要。我还做过一些其他工作,其中 CDATA 标记之间的嵌入标记已经在使用 '' 所以我想删除 <和>文本只是为了与之前的工作保持一致,但最终你是对的,我认为这并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2019-05-23
    • 2022-01-16
    • 2017-10-17
    相关资源
    最近更新 更多