【发布时间】:2016-10-18 03:20:42
【问题描述】:
我必须从存储为nvarchar 的XML 中提取电子邮件Subject。
我正在使用这个查询:
SELECT rtrim((SELECT CAST(
SUBSTRING(
[XML]
,patindex('%<SUBJECT>%', [XML])
,patindex('%</SUBJECT>%', [XML])-patindex('%<SUBJECT>%', [XML])+len('</SUBJECT>')
) as XML).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)')
FROM dbo.Mails
)) as SUBJECT
这个查询首先提取包含我转换为 XML 的电子邮件主题 (<SUBJECT>....</SUBJECT>) 的字符串,然后使用 XML 的 value 函数获取主题值。
这可以正常工作,但在某些情况下 XML 格式不正确并且解析失败。示例:
DECLARE @XMLData XML = '<SUBJECT>
<OPTION CONSTRAINT="MASTER.IN_TITLE = '' OR MASTER.IN_LASTNAME = ''"><![CDATA[Découvrez nos offres de location]]>
</OPTION>
<OPTION CONSTRAINT="IN_TITLE <> '' AND MASTER.IN_LASTNAME <> ''"><![CDATA[~IN_TITLE~ ~IN_LASTNAME~, découvrez nos offres de location]]>
</OPTION>
</SUBJECT>'
select rtrim((@XMLData).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)') )
在Option 属性Constraint 中,我有一个特殊字符<,如果我尝试转义这个字符,它会转义所有其他字符并且我丢失了XML 结构。那么如何逃脱呢?
另一个例子是这样的:
DECLARE @XMLData XML = '<SUBJECT>
<OPTION NAME="DEFAULT"><![CDATA[~(IF((IN_TITLE<>'' AND IN_LASTNAME<>''),IN_TITLE&' '&IN_LASTNAME&',',''))~ nos plus belles réalisations de 2015]]>
</OPTION>
</SUBJECT>'
select rtrim((@XMLData).value('(/SUBJECT/OPTION)[1]','nvarchar(2000)') )
这里我在&IN_LASTNAME& 附近遇到错误,但我认为我们不需要转义CDATA 中的特殊字符!
有没有人有办法避免这些解析错误?
【问题讨论】:
标签: sql sql-server xml sql-server-2008 xml-parsing