Написание XMLDocument без выхода в C # - PullRequest
1 голос
/ 10 сентября 2009

В настоящее время я пишу XHTML в XmlDocument. Это прекрасно работает, но я застрял на одной проблеме. Некоторые элементы XmlText могут содержать такие вещи, как & nbsp ;. Когда я хочу записать такие вещи в поток, он использует innerXML вместо значения innerText для таких узлов. Проблема в том, что вывод неправильный, потому что теперь его вывод & amp; nbsp; вместо & nbsp ;. Как я могу использовать xmlwriter и xmldocument, не выполняя такое экранирование при записи в поток? Я просто хочу вывод без экранирования.

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Вы почти наверняка пытаетесь решить не ту проблему здесь. Если вам нужен текст с неразрывными пробелами, вам следует использовать символ неразрывный пробел . В строковом литерале C # вы можете записать его как escape-последовательность \u00A0, например:

     var xmldoc = new XmlDocument();
     XmlElement test = xmldoc.CreateElement("test");
     xmldoc.AppendChild(test);
     XmlText nbsp = xmldoc.CreateTextNode("\u00A0");
     test.AppendChild(nbsp);

HTML-сущности, такие как nbsp, являются просто способом кодирования таких символов в текстовом файле, не поддерживающем юникод. Вы не должны использовать их при создании XML DOM. Кстати, если вы заставите .NET записать вышеупомянутый DOM в файл в кодировке ASCII (через надлежащие XmlWriterSettings), то он, вероятно, запишет символ неразрывного пробела как  . В файле в кодировке UTF-8 (по умолчанию) он будет отображаться в виде пробела.

Если вы заставите определенные буквенные последовательности символов появляться в выводе XML, то вы рискуете создать недопустимый XML, который не может быть загружен соответствующими процессорами XML. Например, попробуйте загрузить <test> & nbsp; </test> в пустом XmlDocument. Это бросит исключение. Чтобы быть справедливым, вы можете объявлять такие объекты, и схема XHTML делает это. Но я надеюсь, что вы понимаете мою точку зрения.

edit : XmlDocument выполняет свою работу правильно. Если он не будет экранировать символы, такие как & <>, вы можете создать недопустимый XML, который невозможно загрузить снова. Для принудительного создания сущности XML в выводе вы должны использовать XmlDocument.CreateEntityReference . Ошибка заключается в том, что любой код использует сущности в узлах XmlText вместо генерации узлов XmlEntityReference.

2 голосов
/ 10 сентября 2009

Если вы используете XmlWriter.WriteRaw, он не будет выполнять экранирование - он предполагает, что у вас есть необработанный XML.

Например:

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        using (XmlWriter writer = XmlWriter.Create(Console.Out))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("root");
            writer.WriteRaw("<element>&nbsp;</element>");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
    }
}

Выход:

<?xml version="1.0" encoding="IBM437"?><root><element>&nbsp;</element></root>
1 голос
/ 10 сентября 2009

Предполагается, что вы используете .NET 3.x, изучаете и используете LINQ-to-XML ... API очень простой и более функциональный Таким образом, вам не нужно проходить / проходить через DOM ... вместо этого вы можете просто запросить дерево объектов.

В частности, посмотрите на классы XDocument API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...