Xml-кодирование С#

Я сейчас схожу с ума от C# и XmlDocuments.

Мне нужно преобразовать данные XML в другой XML, но я не могу заставить работать специальные символы.

Я работаю с XmlDocument и XmlNode.

Что я пробовал до сих пор:
- XmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes");
- XmlTextWriter writer = new XmlTextWriter(outputDir + "systems.xml", Encoding.UTF8);

Что я знаю точно:
- Входной XML тоже UTF-8
- Значение "InnerText" кодируется без замены символов

Вот некоторый код (не весь... путь к большому количеству кода):

XmlDocument newXml = new XmlDocument();
newXml = (XmlDocument)systemsTemplate.Clone();
newXml.CreateXmlDeclaration("1.0", "UTF-8", "yes");
newXml.SelectSingleNode("systems").RemoveAll();
foreach(XmlNode categories in       exSystems.SelectNodes("root/Content/Systems/SystemLine"))
        {
            XmlNode categorieSystemNode = systemsTemplate.SelectSingleNode("systems/system").Clone();
            categorieSystemNode.RemoveAll();
            XmlNode importIdNode = systemsTemplate.SelectSingleNode("systems/system/import_id").Clone();
            string import_id = categories.Attributes["nodeName"].Value;
            importIdNode.InnerText = import_id;
            categorieSystemNode.AppendChild(importIdNode);
            [way more Nodes which I proceed like this]
        } 
 newXml.SelectSingleNode("systems").AppendChild(newXml.ImportNode(categorieSystemNode, true));
XmlTextWriter writer = new XmlTextWriter(outputDir + "systems.xml", Encoding.UTF8);
        writer.Formatting = Formatting.Indented;
        newXml.Save(writer);
        writer.Flush();
        writer.Close();

Но я получаю это в качестве примера:

<intro>&lt;p&gt;Whether your project [...]</intro>

Вместо этого:

<intro><p>Whether your project [...] </p></intro>

У меня есть другие не-html теги в XML, поэтому, пожалуйста, не предоставляйте решения для анализа HTML :/
Я знаю, что могу заменить символы на String.Replace(), но это грязно и небезопасно (и медленно с около 20 тыс. строк).

Я надеюсь, что есть более простой способ сделать это.

С уважением,
Эривас


person Eriwas    schedule 13.07.2016    source источник
comment
Предоставьте минимально воспроизводимый пример. Ваш код содержит много вещей, которые не имеют отношения к делу, и неясно, в чем проблема. Как возможный намек, вы получите эту проблему, если вы установите InnerText с содержимым XML, это не имеет ничего общего с кодировкой текста. Если вам нужен «более простой способ», я настоятельно рекомендую отказаться от XmlDocument в пользу LINQ to XML.   -  person Charles Mager    schedule 13.07.2016
comment
Вы пробовали InnerXml вместо InnerText?   -  person Manfred Radlwimmer    schedule 13.07.2016


Ответы (1)


Основное предложение XmlDocument состоит в том, чтобы предоставить простой способ работы с XML-документами, гарантируя, что результатом будет правильно сформированный документ.

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

Но если вы все равно хотите добавить фрагмент XML, вам следует придерживаться InnerXml или ImportNode. Вы должны знать, что это может привести к более сложной структуре документа, и вы, вероятно, хотели бы избежать этого.

В качестве третьей возможности вы можете использовать CreateCDataSection, чтобы добавить CDATA и добавить туда свой текст.

Вам определенно следует отказаться от обработки этого XML-документа как строки, попробовав Replace вещи; придерживайтесь рамки, и все будет в порядке.

person Rubens Farias    schedule 13.07.2016