转义xml与cdata同时具有转义的数据值和标签

时间:2014-08-18 04:46:24

标签: c# xml xslt

我从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将cdml内部和外部的xml转换为另一种xml格式,但我很难弄清楚如何将其转换为可用的xml格式,使用c#或xsl所以我可以将xsl转换为不同的格式。我希望它看起来如下:

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

1 个答案:

答案 0 :(得分:0)

您显示的数据可能无法正确转义。如果你忽视它,它可能会产生格式不正确的XML。考虑这一行:

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

如果你无视它,它就会变成这样:

<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>

这仍然有效(大于 - 不需要转义),但我认为你在那里也会有&lt;必须被转义。如果双重逃脱,你应该没事。

要对此进行转换,您可以执行以下操作:

  • 使用XSLT 1.0或2.0,将其转换为两次,一次执行 将disable-output-escaping设置为yes,另一个设置为unescaping 一个人做了实际的改造。
  • 使用带有字符串并返回节点集的扩展函数。
  • 使用XSLT 3.0,使用新功能fn:parse-xmlfn: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循环才能处理它。