簡體   English   中英

具有cdata的轉義xml,同時也具有轉義數據值和標記

[英]escaped xml with cdata that has also has both escaped data value and tags

我正在從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格式的xsl,但是我很難弄清楚如何使用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>

這仍然是有效的(不需要大於),但是我認為您也將&lt; 在某個地方, 必須逃脫。 如果它是雙重逃脫的,那應該沒問題。

要對此進行轉換,您可以執行以下幾項操作:

  • 使用XSLT 1.0或2.0,請對其進行兩次轉換,一次通過將disable-output-escaping設置為yesdisable-output-escaping ,另一次進行實際的轉換。
  • 使用擴展函數,該擴展函數接受字符串並返回節點集。
  • 在XSLT 3.0中,使用新函數fn:parse-xmlfn:parse-xml-fragment ,可以將XML as-a-string作為輸入。
  • 如果您的整個源都已轉義,則如此處所述, 將未轉義的源提供給XSLT處理器 這還將處理轉義的CDATA(但該部分將保持轉義,請參見下文)。

從您的帖子中還不能完全清楚的是它是否被雙重刪除了。 即,如果您的數據如下所示:

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

它是唯一逃脫的。 如果看起來像這樣:

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

它是雙重逃脫的。 在后一種情況下,您將需要執行一個額外的轉義循環,然后才能對其進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM