为什么我无法在 T-SQL 中启用 DTD 支持?

问题描述 投票:0回答:1

我正在 T-SQL 中使用 DTD 并使用以下代码:

use customers;

DECLARE @xmlData XML;
SET @xmlData = '<!DOCTYPE replace [<!ENTITY example "Doe"> ]><customer><name>John Doe</name><address>123 Main St, Anytown, USA</address><salary>&example</salary></customer>';

INSERT INTO customers (name, address, salary)
SELECT
    T.c.value('(name/text())[1]', 'NVARCHAR(MAX)'),
    T.c.value('(address/text())[1]', 'NVARCHAR(MAX)'),
    T.c.value('(salary/text())[1]', 'DECIMAL(18, 2)')
FROM @xmlData.nodes('/customers/customer') AS T(c);

我收到以下错误消息。

不允许使用内部子集 DTD 解析 XML。将

CONVERT
与样式选项 2 结合使用可启用有限的内部子集 DTD 支持。

我尝试修复转换功能:

SET @xmlData = CONVERT(XML, @xmlData, 2);

Select CONVERT(XML, @xmlData, 2);

似乎没有什么可以解决这个问题。有人可以给我一些提示吗?

sql sql-server xml t-sql dtd
1个回答
0
投票

在分配失败后继续使用

CONVERT
变量是行不通的。您需要明确
CONVERT
您拥有的文字字符串:

DECLARE @xmlData XML;
SET @xmlData = CONVERT(xml,'<!DOCTYPE replace [<!ENTITY example "Doe"> ]><customer><name>John Doe</name><address>123 Main St, Anytown, USA</address><salary>&example</salary></customer>',2);

然而,这会给你一个不同的错误(和打印语句):

消息 9411,第 16 级,状态 1,第 2 行
XML 解析:第 1 行,第 137 个字符,需要分号

XML DTD 已从一个或多个 XML 片段中剥离。外部子集(如果有)已被忽略。

这个错误是因为

<salary>&example</salary>
; & 符号需要转义为
&amp;
。如果您在源头解决了这个问题,那么它就会起作用并且 DTD 会被删除:

DECLARE @xmlData XML;
SET @xmlData = CONVERT(xml,'<!DOCTYPE replace [<!ENTITY example "Doe"> ]><customer><name>John Doe</name><address>123 Main St, Anytown, USA</address><salary>&amp;example</salary></customer>',2);
© www.soinside.com 2019 - 2024. All rights reserved.