使用 xml 格式的属性值创建 xml
Create xml with attribute value in xml format
如何将 table 中已采用 XML 格式的列中的值创建为 XML 中属性的值并保留其 XML格式(括号、引号等)? (似乎正在发生的事情的术语是字符(<,>,“)正在被实体化。)(SQL SERVER 2008 R2)
declare @T table (
ID int identity,
Col1 varchar(200),
Col2 varchar(max)
);
insert @T
select 'ABC', 'Value01'
union
select 'DEF', '<Ele01>A01</Ele01>'
union
select 'GHI', '<Elements><Ele02>A02</Ele02><Ele03>A03</Ele03></Elements>'
union
select 'JKL', '<Ele04 Att01="V01" Att02="V02" />';
select (
select
Col1 as '@Col1',
Col2 as '@Col2'
from @T
for xml path(N'Item'), type
) as TValues
for xml path(N'T'), type, elements xsinil;
结果应如下所示:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
这是实际结果:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
我已经搜索了一个答案,这些是我能找到的一些在某种程度上解决了这个问题的唯一链接:
http://blogs.lobsterpot.com.au/2010/04/15/handling-special-characters-with-for-xml-path/
How do I avoid character encoding when using "FOR XML PATH"?
https://www.red-gate.com/simple-talk/sql/learn-sql-server/using-the-for-xml-clause-to-return-query-results-as-xml/
我知道我可以在事后替换实体化字符,但我相信一定有更好的方法。
我非常感谢知道如何实现这一目标的人的帮助。
如果我的问题不符合某人的标准,我深表歉意。
您的 "should look like" XML 根本不是 XML -- 这就是您的工具无法帮助您的原因。没有一致的 XML 处理器将帮助您生成格式不正确的 XML。您需要修复 XML 设计,使标记不会出现在属性值中,或者您需要处理工具为您提供的转义版本。
如果您说您无法修复 XML 设计或处理属性值中的转义字符,那么您必须在没有 XML 库和工具支持的情况下生活,因为它们不会帮助您使用 "should look like" 格式。准备在字符流级别操作,并构建您自己的工具集。还要让数据的消费者做好准备,他们也将无法使用 XML 工具。
底线:不要生成格式不正确的 XML。
如您所知,您的 XML 无效。生成一个 看起来像 XML 的字符串很容易,但这并不意味着您的字符串 有效 XML。
I understand that I can replace the entitized characters after
如果你这样做,你必须用 REPLACE
在字符串级别上做,但这会破坏你的 XML。没有有效的工具能够读取它!
第一个问题是:为什么要将此 XML 存储在列 VARCHAR(MAX)
中? XML 不仅仅是一些 带有花哨附加功能的愚蠢文本... 您应该将此专栏设为 XML
类型。这将确保您的片段有效 XML.
你可能会做什么:你可以将你的片段作为有效的子元素放入你的 XML:
select (
select
Col1 as '@Col1',
CAST(Col2 AS XML) as 'Col2'
from @T
for xml path(N'Item'), type
) as TValues
for xml path(N'T'), type, elements xsinil;
结果
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC">
<Col2>Value01</Col2>
</Item>
<Item Col1="DEF">
<Col2>
<Ele01>A01</Ele01>
</Col2>
</Item>
<Item Col1="GHI">
<Col2>
<Elements>
<Ele02>A02</Ele02>
<Ele03>A03</Ele03>
</Elements>
</Col2>
</Item>
<Item Col1="JKL">
<Col2>
<Ele04 Att01="V01" Att02="V02" />
</Col2>
</Item>
</TValues>
</T>
如何将 table 中已采用 XML 格式的列中的值创建为 XML 中属性的值并保留其 XML格式(括号、引号等)? (似乎正在发生的事情的术语是字符(<,>,“)正在被实体化。)(SQL SERVER 2008 R2)
declare @T table (
ID int identity,
Col1 varchar(200),
Col2 varchar(max)
);
insert @T
select 'ABC', 'Value01'
union
select 'DEF', '<Ele01>A01</Ele01>'
union
select 'GHI', '<Elements><Ele02>A02</Ele02><Ele03>A03</Ele03></Elements>'
union
select 'JKL', '<Ele04 Att01="V01" Att02="V02" />';
select (
select
Col1 as '@Col1',
Col2 as '@Col2'
from @T
for xml path(N'Item'), type
) as TValues
for xml path(N'T'), type, elements xsinil;
结果应如下所示:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
这是实际结果:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
我已经搜索了一个答案,这些是我能找到的一些在某种程度上解决了这个问题的唯一链接: http://blogs.lobsterpot.com.au/2010/04/15/handling-special-characters-with-for-xml-path/ How do I avoid character encoding when using "FOR XML PATH"? https://www.red-gate.com/simple-talk/sql/learn-sql-server/using-the-for-xml-clause-to-return-query-results-as-xml/
我知道我可以在事后替换实体化字符,但我相信一定有更好的方法。 我非常感谢知道如何实现这一目标的人的帮助。
如果我的问题不符合某人的标准,我深表歉意。
您的 "should look like" XML 根本不是 XML -- 这就是您的工具无法帮助您的原因。没有一致的 XML 处理器将帮助您生成格式不正确的 XML。您需要修复 XML 设计,使标记不会出现在属性值中,或者您需要处理工具为您提供的转义版本。
如果您说您无法修复 XML 设计或处理属性值中的转义字符,那么您必须在没有 XML 库和工具支持的情况下生活,因为它们不会帮助您使用 "should look like" 格式。准备在字符流级别操作,并构建您自己的工具集。还要让数据的消费者做好准备,他们也将无法使用 XML 工具。
底线:不要生成格式不正确的 XML。
如您所知,您的 XML 无效。生成一个 看起来像 XML 的字符串很容易,但这并不意味着您的字符串 有效 XML。
I understand that I can replace the entitized characters after
如果你这样做,你必须用 REPLACE
在字符串级别上做,但这会破坏你的 XML。没有有效的工具能够读取它!
第一个问题是:为什么要将此 XML 存储在列 VARCHAR(MAX)
中? XML 不仅仅是一些 带有花哨附加功能的愚蠢文本... 您应该将此专栏设为 XML
类型。这将确保您的片段有效 XML.
你可能会做什么:你可以将你的片段作为有效的子元素放入你的 XML:
select (
select
Col1 as '@Col1',
CAST(Col2 AS XML) as 'Col2'
from @T
for xml path(N'Item'), type
) as TValues
for xml path(N'T'), type, elements xsinil;
结果
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC">
<Col2>Value01</Col2>
</Item>
<Item Col1="DEF">
<Col2>
<Ele01>A01</Ele01>
</Col2>
</Item>
<Item Col1="GHI">
<Col2>
<Elements>
<Ele02>A02</Ele02>
<Ele03>A03</Ele03>
</Elements>
</Col2>
</Item>
<Item Col1="JKL">
<Col2>
<Ele04 Att01="V01" Att02="V02" />
</Col2>
</Item>
</TValues>
</T>