Проблема с кодировкой .NET XMLDocument - PullRequest
2 голосов
/ 13 марта 2012

В данный момент я сталкиваюсь с довольно специфической проблемой. Я храню некоторые данные в XMLDocument и сохраняю их на жестком диске. Они выглядят так:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Units>
    <Unit>
      <Name>Kilogramm</Name>
      <ShortName>Kg</ShortName>
    </Unit>
    <Unit>
      <Name>Flasche(n)</Name>
      <ShortName>Fl</ShortName>
    </Unit>
    <Unit>
      <Name>Stück</Name>
      <ShortName>St</ShortName>
    </Unit>
    <Unit>
      <Name>Beutel</Name>
      <ShortName>Btl</ShortName>
    </Unit>
    <Unit>
      <Name>Schale</Name>
      <ShortName>Sch</ShortName>
    </Unit>
    <Unit>
      <Name>Kiste</Name>
      <ShortName>Ki</ShortName>
    </Unit>
    <Unit>
      <Name>Meter</Name>
      <ShortName>m</ShortName>
    </Unit>
    <Unit>
      <Name>Stunde(n)</Name>
      <ShortName>h</ShortName>
    </Unit>
    <Unit>
      <Name>Glas</Name>
      <ShortName>Gl</ShortName>
    </Unit>
    <Unit>
      <Name>Portion</Name>
      <ShortName>Port</ShortName>
    </Unit>
    <Unit>
      <Name>Dose</Name>
      <ShortName>Do</ShortName>
    </Unit>
    <Unit>
      <Name>Paket</Name>
      <ShortName>Pa</ShortName>
    </Unit>
  </Units>
</Settings>

Я загружаю файл с помощью XMLDocument.Load () и сохраняю его с помощью XMLDocument.Save (). Но теперь я сохранил файл со старого компьютера и теперь получил исключение для специальных символов (ä, ö, ü) после сохранения и перезагрузки.
На самом деле просмотр файлов в Блокноте не показывает различий, но просмотр в шестнадцатеричном виде есть! Как это возможно?

Ответы [ 2 ]

4 голосов
/ 01 октября 2012

Вы можете использовать этот метод расширения , чтобы установить декодирование перед сохранением.

/// <summary>
/// Gets the XmlDeclaration if it exists, creates a new if not.
/// </summary>
/// <param name="xmlDocument"></param>
/// <returns></returns>
public static XmlDeclaration GetOrCreateXmlDeclaration(this XmlDocument xmlDocument)
{
    XmlDeclaration xmlDeclaration = null;
    if (xmlDocument.HasChildNodes)
        xmlDeclaration = xmlDocument.FirstChild as XmlDeclaration;

    if (xmlDeclaration != null)
        return xmlDeclaration;
    //Create an XML declaration. 
    xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", null, null);

    //Add the new node to the document.
    XmlElement root = xmlDocument.DocumentElement;
    xmlDocument.InsertBefore(xmlDeclaration, root);
    return xmlDeclaration;
}

Использование:

XmlDeclaration xmlDeclaration = xmlDocument.GetOrCreateXmlDeclaration();
xmlDeclaration.Encoding = Encoding.UTF8.WebName;
xmlDocument.Save(@"filename");
0 голосов
/ 13 июля 2016

Вы можете напрямую добавить объявление

var Doc = new XmlDocument();
Doc.AppendChild(Doc.CreateXmlDeclaration("1.0", "utf-8", null));
var productsNode = Doc.AppendChild(Doc.CreateElement("products"));
//do other stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...