簡體   English   中英

特殊字符的轉換,同時將其添加到 C# 中的 XML 內部文本

[英]Conversion of the special characters while adding it to the XML innertext in C#

在編寫內部文本時,我需要對特殊字符使用十六進制代碼,但無法添加它。 我嘗試了一些編碼更改,但它不起作用。 我需要像這樣的輸出

–CO–OR代替"–CO–OR"

"+" 而不是"+"

下面提供了我要轉換的代碼。

else
{
  //convertedStr = System.Net.WebUtility.HtmlDecode(runText);
  Encoding iso = Encoding.Default; 
  Encoding utf8 = Encoding.Unicode;
  byte[] utfBytes = utf8.GetBytes(runText);
  byte[] isoBytes = Encoding.Convert(iso, utf8, utfBytes);
  string msg = iso.GetString(isoBytes);    
  eqnPartElm = clsGlobal.XMLDoc.CreateElement("inf");
  eqnPartElm.InnerText = msg;
  eqnElm.AppendChild(eqnPartElm);   
}

Unicode 字符的轉義不是由XmlDocument建模或控制的。 相反,在將文檔寫入流時, XmlWriter將轉義當前encoding不支持的字符數據屬性值中的字符,如XmlWriterSettings.Encoding指定的那樣。 如果您希望轉義所有“特殊字符”,例如 En Dash,請選擇非常嚴格的編碼,例如Encoding.ASCII

要輕松做到這一點,請創建以下擴展方法:

public static class XmlSerializationHelper
{
    public static string GetOuterXml(this XmlNode node, bool indent = false, Encoding encoding = null, bool omitXmlDeclaration = false)
    {
        if (node == null)
            return null;
        using var stream = new MemoryStream();
        node.Save(stream, indent : indent, encoding : encoding, omitXmlDeclaration : omitXmlDeclaration, closeOutput : false);
        stream.Position = 0;
        using var reader = new StreamReader(stream);
        return reader.ReadToEnd();
    }

    public static void Save(this XmlNode node, Stream stream, bool indent = false, Encoding encoding = null, bool omitXmlDeclaration = false, bool closeOutput = true) =>
        node.Save(stream, new XmlWriterSettings
                  {
                      Indent = indent,
                      Encoding = encoding,
                      OmitXmlDeclaration = omitXmlDeclaration,
                      CloseOutput = closeOutput,
                  });

    public static void Save(this XmlNode node, Stream stream, XmlWriterSettings settings)
    {
        using (var xmlWriter = XmlWriter.Create(stream, settings))
        {
            node.WriteTo(xmlWriter);
        }
    }
}

現在您將能夠執行以下操作來將XmlDocument序列化為帶有非 ASCII 字符轉義的字符串:

// Construct your XmlDocument (not shown in the question)
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<Root></Root>");
var eqnPartElm = xmlDoc.CreateElement("inf");
xmlDoc.DocumentElement.AppendChild(eqnPartElm);

// Add some non-ASCII text (here – is an En Dash character).
eqnPartElm.InnerText = "–CO–OR";

// Output to XML and escape all non-ASCII characters.
var xml = xmlDoc.GetOuterXml(indent : true, encoding : Encoding.ASCII, omitXmlDeclaration : true);

要序列化為Stream ,請執行以下操作:

using (var stream = new FileStream(fileName, FileMode.OpenOrCreate))
{
    xmlDoc.Save(stream, indent : true, encoding : Encoding.ASCII, omitXmlDeclaration : true);
}

並且將創建以下 XML:

<Root>
  <inf>&#x2013;CO&#x2013;OR</inf>
</Root>

筆記:

  • 您必須使用新的XmlWriter而不是舊的XmlTextWriter ,因為后者不支持用轉義后備替換不受支持的字符。

  • XML 文檔的某些部分,包括元素和屬性名稱以及注釋文本,不支持包含字符實體。 如果您嘗試在這種情況下寫入不受支持的字符, XmlWriter將引發異常。

演示小提琴在這里

暫無
暫無

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

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