【问题标题】:escaped xml with cdata that has also has both escaped data value and tags使用 cdata 转义 xml,同时具有转义数据值和标签
【发布时间】:2014-08-18 04:46:24
【问题描述】:

我从 Web 服务接收 xml 数据,该服务将所有数据作为一个转义的 xml 字符串返回。但是无论出于何种原因,部分 xml 都包含在 cdata 标记中。 cdata 中的转义 xml 通常也包含转义的 xml 字符。示例:

<root>
  <importData>dat</importData>
  <Response>
   <![CDATA[&lt;SecondRoot&gt;
   &lt;Data&gt;123&lt;/Data&gt;
   &lt;DataEscapedCharacterIncluded&gt; 3 &gt; 1&lt;/DataEscapedCharacterIncluded&gt;
   &lt;/SecondRoot&gt;]]>
  &lt;/Response&gt;
&lt;/root&gt;

我需要使用 xsl 将 cdata 部分内外的 xml 转换为另一种 xml 格式,但我很难弄清楚如何使用 c# 或 xsl 将其转换为可用的 xml 表单,所以我可以将 xsl 转换为不同的格式。我希望它如下所示:

  <root>
     <importData>dat</importData>
     <Response>
      <SecondRoot>
       <Data>123</Data>
       <DataEscapedCharacterIncluded> 3 &gt; 1</DataEscapedCharacterIncluded>
      </SecondRoot>
     </Response>
  <root>

【问题讨论】:

  • 也许你可以将你的xml转换为字符串,并在c#中使用replace方法来删除,那么它应该成为一个有效的xml语法
  • 你确定整个响应在源头被转义了吗?

标签: c# xml xslt


【解决方案1】:

您显示的数据可能未正确转义。如果取消转义,它可能会产生格式不正确的 XML。考虑这一行:

&lt;DataEscapedCharacterIncluded&gt; 3 &gt; 1&lt;/DataEscapedCharacterIncluded&gt;

如果你取消它,它会变成这样:

<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>

这仍然有效(大于不需要转义),但我假设您在某处也会有&amp;lt;,必须转义。如果它被双重转义,你应该没问题。

要改变这一点,您可以做几件事:

  • 使用 XSLT 1.0 或 2.0,将其转换为两遍,其中一遍执行 将disable-output-escaping 设置为yes 和另一个 一个来做实际的转换。
  • 使用接受字符串并返回节点集的扩展函数。
  • 对于 XSLT 3.0,使用新功能 fn:parse-xml 或 fn:parse-xml-fragment,可以将 XML-as-a-string 作为 输入。
  • 如果您的整个源代码都被转义了,就像看起来一样,feed it unescaped to the XSLT processor as explained here。这也将照顾 转义的 CDATA(但该部分仍将转义,见下文)。

您的帖子中尚不完全清楚的是它是否被双重转义。即,如果您的数据如下所示:

<elem><![CDATA[<root>bla</root>]]></elem>

它是单独转义的。如果它看起来像这样:

<elem><![CDATA[&lt;root&gt;bla&lt;/root&gt;]]></elem>

它被双重转义。在后一种情况下,您需要执行一个额外的 unescape 循环才能处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多