我正在 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。将
与样式选项 2 结合使用可启用有限的内部子集 DTD 支持。CONVERT
我尝试修复转换功能:
SET @xmlData = CONVERT(XML, @xmlData, 2);
Select CONVERT(XML, @xmlData, 2);
似乎没有什么可以解决这个问题。有人可以给我一些提示吗?
在分配失败后继续使用
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>
; & 符号需要转义为 &
。如果您在源头解决了这个问题,那么它就会起作用并且 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>&example</salary></customer>',2);