2013-05-09 126 views
0

我试图添加一个非法字符的元素有问题。我有以下SQLSQL XML中的感叹号

SELECT 
'en-GB' AS '@xml:lang', 
'[email protected]' AS '@payloadID', 
'2012-02-17T16:46:11' AS '@timestamp', 
'1.2.014' AS '@version', 
    (SELECT 
    (SELECT /* FROM */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 33333 AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE), 
     (SELECT 'name' AS 'Credential/@domain', 'Test Limited' AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE) 
     FOR XML PATH('From'), TYPE), 
    (SELECT /* TO */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 66666 AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE), 
     (SELECT 'name' AS 'Credential/@domain', 'Test Company' AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE) 
     FOR XML PATH('To'), TYPE), 
    (SELECT /* SENDER */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 13041 AS 'Credential/Identity', '' AS 'Credential/SharedSecret' 
     FOR XML PATH(''), TYPE), ' cXML Link v1.3.0' AS 'UserAgent' 
     FOR XML PATH('Sender'), TYPE) 
    FROM TEST2.PORDER 
    WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('Header'),TYPE) 
    , (SELECT 'production' AS '@deploymentMode', 
    (SELECT 
        (SELECT /* ShipNoticeHeader */ 
       (SELECT '' 
       FOR XML PATH(''), 
        TYPE) 
      FOR XML PATH('ShipNoticeHeader'), 
       TYPE), 
      (SELECT '' AS '@domain', 
       '' as 'CarrierIdentfier', 
         ''AS 'ShipmentIdentifier' 
      FOR XML PATH('ShipControl'), 
       TYPE), 
           (SELECT /* Ship Notice Portion */ 
        (SELECT '1;29117/42' AS 'DocumentReference/@PayLoadID', 
          '' AS 'DocumentReference' 
        FOR XML PATH('OrderReference'), 
         TYPE), 
              (SELECT '4' AS '@Quantity', 
              '1' AS '@LineNo', 
          'Box 4' AS 'UnitOfMeasure' 
        FOR XML PATH('ShipNoticeItem'), 
         TYPE) 
        FOR XML PATH('ShipNoticePortion'), 
         TYPE) 

     FROM TEST2.PORDER 
     WHERE POHNUM_0 = '2011302POH00000002' 
     FOR XML PATH('ShipNoticeRequest'), 
      TYPE) 
    FROM TEST2.PORDER 
    WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('Request'), 
     TYPE) 
FROM TEST2.PORDER 
WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('?XML') 

正如你所看到的,我在根域中有一个问号。这个错误会失败。 '?XML'包含FOR XML所要求的无效XML标识符; '?'(0x003F)是错误的第一个字符'。

我的问题是我需要能够创建具有非法字符的元素。例如,我还需要围绕此消息的另一个元素,它将是“<!DOCTYPE >”。相同的情况,除了这个字段有感叹号。

这是可能的第一次,如果是这样,任何人都可以帮我完成它。

在此先感谢

+0

你可能认为数据库层不是尝试构建一个完全成熟的文档的最明智的地方(这不是真的* XML,所以XML设施正在与你打交道) – 2013-05-09 13:43:37

回答

0

你不能做到这一点作为For XML的一部分,但是你可以通过使用FOR XMLNVARCHAR操作的组合实现这一目标。

所以,如果你想添加一个DOCTYPE(因为你是在现实中生成HTML),你可以做这样的:

select '<!DOCTYPE html>' 
+ cast(
(
    -- XML bit here 
    -- Replace this with your XML query. 

    select 
     A 
    from (
     select 'a1' as A 
     union select 'a2' 
     ) a 
     for xml path(''), root('Z'), type 
) 
as nvarchar(Max)) 

但是请注意,结果将适合SQL XML服务器重新导入。

讨论

XML和HTML是相关的(都是类型SGML),但不一样的。 HTML具有XML不具备的功能,而XML具有HTML不具备的功能。

您可以编写XML的一个子集,它也是HTML的一个子集,通常很有用,但其中一个也不是其他子集。