使用 sql:use-cdata(XDR 架构)创建 CDATA 节

重要说明重要提示

本主题是针对早期应用程序提供的参考。以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能。请改用带批注的 XSD 架构创建 XML 视图。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0)。可以将现有带批注的 XDR 架构转换为 XSD 架构。有关详细信息,请参阅将带批注的 XDR 架构转换为等效的 XSD 架构 (SQLXML 4.0)

在 XML 中,CDATA 节用于对其中所含字符否则会被识别为标记的文本块进行转义。

Microsoft SQL Server 数据包含的字符可能被 XML 分析器视为特殊字符,例如,<、>、< =、& 这样的字符被视为标记字符。如果想避免 SQL Server 数据包含被视为标记的特殊字符,可以将它们放在 CDATA 节中。放在 CDATA 节中的文本被视为纯文本。

sql:use-cdata 批注用于指定 SQL Server 返回的数据是否包含在 CDATA 节中。使用 sql:use-cdata 批注可以指示由 sql:field 指定的列中的值是否应当包含在 CDATA 节中。可以在 <ElementType><element> 上指定 sql:use-cdata 批注,并接受布尔值(0 = FALSE,1 = TRUE)。sql:use-cdata 不能与 sql:url-encode 一起使用,也不能用在任何属性类型 ID、IDREF、IDREFS、NMTOKEN 或 NMTOKENS 上。

示例

若要创建使用以下示例的工作示例,必须满足一些要求。有关详细信息,请参阅运行 SQLXML 示例的要求

A. 在元素上指定 sql:use-cdata

在该架构中,对于 <AddressLine1> 元素,sql:use-cdata 设置为 1 (TRUE)。结果,在 CDATA 节中返回 <AddressLine1> 的数据。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
   xmlns:dt="urn:schemas-microsoft-com:datatypes"
   xmlns:sql="urn:schemas-microsoft-com:xml-sql">

   <ElementType name="AddressID" content="textOnly" />
   <ElementType name="AddressLine1" content="textOnly" />

   <ElementType name="Address" sql:relation="Person.Address">
      <element type="AddressID" />
      <element type="AddressLine1" sql:use-cdata="1"  />
   </ElementType>

</Schema>

针对该架构测试示例 XPath 查询

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将该文件另存为 UseCdataXdr.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 UseCdataXdr.xml 的相同目录中将该文件另存为 UseCdataXdrT.xml。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="UseCdataXdr.xml">
        /Address[@AddressID=1]
      </sql:xpath-query>
    </ROOT>
    

    为映射架构 (UseCdataXdr.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:

    mapping-schema="C:\MyDir\UseCdataXdr.xml"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询

下面是结果集:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Address>
    <AddressID>1</AddressID> 
    <AddressLine1>
       <![CDATA[ 1970 Napa Ct.]]> 
    </AddressLine1>
  </Address>
</ROOT>