gpt4 book ai didi

c# - 带有 cdata 的转义 xml 也具有转义数据值和标签

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:10 25 4
gpt4 key购买 nike

我正在从一个 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。考虑这一行:

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

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

<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>

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

要转换它,您可以做几件事:

  • 使用 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>

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

关于c# - 带有 cdata 的转义 xml 也具有转义数据值和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25356489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com