【问题标题】:Create xml with attribute value in xml format使用 xml 格式的属性值创建 xml
【发布时间】:2017-12-04 22:36:58
【问题描述】:

如何将表中已经采用 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="&lt;Element01&gt;A01&lt;/Element01&gt;" />
    <Item Col1="GHI" Col2="&lt;Elements&gt;&lt;Element02&gt;A02&lt;/Element02&gt;&lt;Element03&gt;A03&lt;/Element03&gt;&lt;/Elements&gt;" />
    <Item Col1="JKL" Col2="&lt;Element04 Att01=&quot;V01&quot; Att02=&quot;V02&quot; /&gt;" />
  </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/

我知道我可以在事后替换实体化字符,但我相信一定有更好的方法。 我非常感谢知道如何实现这一目标的人的帮助。

如果我的问题没有达到别人的标准,我深表歉意。

【问题讨论】:

  • 在 XML 中,你的“应该看起来像”只能是:&lt;Item Col1="DEF" Col2="&lt;![CDATA[&lt;Element01&gt;A01&lt;/Element01&gt;]]" /&gt; or ` - 你有它:-)
  • 嗯..之后的xml部分结果应该是这样的:不是一个有效的xml。

标签: sql-server xml sql-server-2008-r2 for-xml-path


【解决方案1】:

您的“应该看起来像”XML 根本不是 XML ——这就是您的工具无法帮助您的原因。没有符合标准的 XML 处理器可以帮助您生成格式不正确的 XML。您需要修复您的 XML 设计,以便标记不会出现在属性值中,或者您需要处理工具为您提供的转义版本。

如果您说您无法修复您的 XML 设计或处理属性值中的转义字符,那么您必须在没有 XML 库和工具支持的情况下生活,因为它们不会帮助您解决“应该看起来像“格式。准备在字符流级​​别进行操作,并建立自己的工具集。还要为您的数据消费者做好准备,使他们也无法使用 XML 工具。

底线:不要生成格式不正确的 XML。

【讨论】:

    【解决方案2】:

    正如您已经被告知的,您的 XML 无效。生成看起来像 XML 的字符串很容易,但这并不意味着您的字符串是有效的 XML

    我知道我可以替换

    之后的实体化字符

    如果你这样做,你必须在字符串级别使用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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多