2012-05-23 31 views
1

我在將某些字符串附加到某些XML節點時遇到問題。 爲了解釋這更好的我做了一個簡單的例子......試想一下,我有這樣的XML代碼:轉換XmlText節點中的字符時出現問題(從'到&#39)

<song> 
    <title> 
     Surfin&#39; USA 
    </title> 
</song> 

請注意,而不是簡單地寫「的Surfin' USA」我明確地使用&#39;代替的單引號字符。 XML代碼是有效的 - 或者至少它已被我在網上發現和測試的一些工具認爲是有效的。

我的問題是,當我試圖把這個字符串變成XMLTEXT對象,這種方式:

Dim xmlDoc As New XmlDocument() 
Dim xmlMyText As XmlText 


xmlMyText = xmlDoc.CreateTextNode("Surfin&#39; USA") 

我希望有XMLTEXT對象內部非常相同的字符串值,而是它才獲得了稍微不同的值:

MsgBox(xmlMyText.OuterXml) ' OUTPUTS: Surfin&amp;39; USA 

總之,連字符被轉換成&amp;因爲AFAIK「&符號不能留未逸出」。但在我看來,在這種情況下,它並沒有被轉義,因爲它與#39和分號一起使用,我錯了嗎?

你能幫我解釋我怎麼能避免這種轉換?
非常感謝您的寶貴時間和幫助

+1

將文本提供給XmlDocument時,文本應該是未轉義的。 XmlDocument將爲您正確轉義它。 –

+0

謝謝您的澄清 – Cesco

回答

1

這是一個常見的問題,在您輸入的數據的轉義次數與嘗試使用的數據之間存在不匹配。

這裏OuterXml正在做它準備做的事情:給你提供的數據以一個轉義(存儲的XML)形式提供給你。這是一件好事,因爲如果您保存此XML然後將其重新加載到XML文檔中,則可以導航到節點並在節點上請求.InnerText()並獲取原始值,這是您所期望的。否則它會破壞合同。

但是,通過詢問OuterXml(它返回標記)而不是獲取InnerText值(它返回存儲的數據),您在轉義序列上「偏離1」。您可以手動運行數據上的無縫轉換,或使用.InnerText()自動轉換回源數據。

using System; 
using System.Text; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Xml;  

namespace TestProject1 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     private const string testString = "Surfin&#39; USA"; 
     [TestMethod] 
     public void TestMethod1() 
     { 
      XmlDocument xmlDoc = new XmlDocument(); 
      XmlText xmlMyText; 

      xmlMyText = xmlDoc.CreateTextNode(testString); 

      Assert.AreEqual(testString, xmlMyText.InnerText); 

     } 
    } 
} 

該單元測試通過。請原諒我使用C#,但那是我的手指類型。

+0

非常感謝您的解釋 – Cesco

相關問題