2015-11-02 48 views
1

我正在爲舊應用程序生成xml文件。如何在C#中的xml節點值中的引號轉義?

它要求引號(」和「)的節點值必須轉義。

但是C#內建的XmlWriter不能做到這一點,它不會在節點值轉義引號。

我試着用"更換"它傳遞給node.InnerText前 但是寫後,它成爲"

例如,我想這樣的節點:

<node>text contains &quot;</node> 

,但我不是得到這個:

<node>text contains "</node> 

或本:

<node>text contains &amp;quot;</node> 

我怎樣才能逃避XML節點值報價?

+0

替換爲'\ "'? –

+0

似乎很破碎,你需要所有的引號*總是*逃脫 - 是不是一個選項來解決這個問題呢? –

+0

節點值然後變成'\ & amp;';'大聲笑 – Wangwang

回答

1

如果需要保留XML文本中的引用實體,則XML的使用者肯定是錯誤的。默認情況下,內置寫入器替換不必要的實體;但是,您可以通過實施自定義寫入器來覆蓋此行爲:

public class PreserveQuotesXmlTextWriter : XmlTextWriter 
{ 
    private static readonly string[] quoteEntites = { "&apos;", "&quot;" }; 
    private static readonly char[] quotes = { '\'', '"' }; 
    private bool isInsideAttribute; 

    public PreserveQuotesXmlTextWriter(string filename) : base(filename, null) 
    {    
    } 

    public override void WriteStartAttribute(string prefix, string localName, string ns) 
    { 
     isInsideAttribute = true; 
     base.WriteStartAttribute(prefix, localName, ns); 
    } 

    private void WriteStringWithReplace(string text) 
    { 
     string[] textSegments = text.Split(quotes); 

     if (textSegments.Length > 1) 
     { 
      for (int pos = -1, i = 0; i < textSegments.Length; ++i) 
      { 
       base.WriteString(textSegments[i]); 
       pos += textSegments[i].Length + 1; 

       if (pos != text.Length) 
        base.WriteRaw(text[pos] == quotes[0] ? quoteEntites[0] : quoteEntites[1]); 
      } 
     } 
     else base.WriteString(text); 
    } 

    public override void WriteString(string text) 
    { 
     if (isInsideAttribute) 
      base.WriteString(text); 
     else 
      WriteStringWithReplace(text); 
     isInsideAttribute = false; 
    } 
} 
+0

這真的很有幫助,謝謝!我的名聲不到15,積極的態度不會公開看到,哈哈。 – Wangwang

+0

沒關係。 :) – taffer