Должен ли я генерировать XML как строку в С#?

При генерации XML в С# возникает проблема с созданием его как строки? Раньше я обнаружил, что генерация XML программно очень много и сложна. Создание xml посредством конкатенации строк/построитель строк кажется намного проще, но, похоже, это плохая практика.
Должен ли я генерировать XML как строку?

Ответ 1

Классы XDocument, XElement и XAttribute упрощают создание генерации xml на С#. Вместо использования XmlDocument или XmlWriter.

В качестве примера, чтобы произвести это:

<RootElement>
    <ChildElement Attribute1="Hello" Attribute2="World" />
    <ChildElement Attribute1="Foo" Attribute2="Bar" />
</RootElement>

Вы можете сделать это:

XDocument xDocument = new XDocument(
    new XElement("RootElement",
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Hello"),
            new XAttribute("Attribute2", "World")
        ),
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Foo"),
            new XAttribute("Attribute2", "Bar")
        )
    )
);

Ответ 2

Вы пробовали Linq для Xml? это не очень многословно:

XElement xml = new XElement("contacts",
                    new XElement("contact", 
                        new XAttribute("id", "1"),
                        new XElement("firstName", "first"),
                        new XElement("lastName", "last")
                    ),
                    new XElement("contact", 
                        new XAttribute("id", "2"),
                        new XElement("firstName", "first2"),
                        new XElement("lastName", "last2")
                    )
                );
Console.Write(xml);

Ответ 3

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

Вы можете сделать это сейчас. Я подожду.

Теперь спросите себя: действительно ли вы хотите, чтобы ваша конкатенированная строка была действительной в соответствии со всеми этими правилами и самостоятельно записывала все вспомогательные функции, или вы хотите использовать хорошо протестированную библиотеку, где вся эта логика была инкапсулирован для вас?

Хорошо.

Рад, что отсортировано.

Ответ 4

Я бы рекомендовал следующий подход в большинстве случаев, когда вы генерируете xml.

  • Создайте XSD для своего XML
  • Скомпилировать XSD в объект
  • Заполните свой объект
  • Де-сериализуйте свой объект в xml

Всем известно о том, что вы просто создаете xml с помощью XMLDocuments 1. Он хорошо определен с помощью XSD. Другие разработчики знают, какой xml они получают (или то, что они изменяют) 2. Легко изменить в будущем. 3. У вас гораздо меньше шансов на ошибки в вашем XML-документе.

Сообщите мне, нужны ли вам примеры кода или дополнительная помощь в том, как это будет выполнено.

Примечание. Мы генерируем наши файлы cs из xsds во время сборки, чтобы убедиться, что кто-то не вручную модифицирует сгенерированный код.

Ответ 5

Создание XML-конкатенации строк, безусловно, является плохой практикой. XmlDomDocument не очень подробный или запутанный; Я всегда считал, что это довольно легко (и безопасно) для работы.

Ответ 6

Нет, не стоит. Библиотеки XML в .NET(и других платформах) гарантируют, что вы создадите правильный XML, и сэкономит вам много времени, заботясь о его синтаксическом анализе. Кроме того, если кто-то еще должен использовать ваш XML, и жалуется, что он неверен, вы можете исключить сам XML файл и сэкономит вам много времени, чтобы проверить, что вы конкатенируете правильно.

Ответ 7

XmlWriter не так уж плохо, когда вы правильно форматируете свой код:

StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();

    writer.WriteStartElement("root");

    writer.WriteStartElement("Node1");
    writer.WriteAttributeString("att1", "value");
    writer.WriteEndElement();

    writer.WriteStartElement("Node2");
    writer.WriteString("inner text");
    writer.WriteEndElement();

    writer.WriteEndElement();

    writer.WriteEndDocument();
}

Вы также можете добавить идентификатор в свой код, чтобы облегчить понимание.

using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();
    {
        writer.WriteStartElement("root");
        {
            writer.WriteStartElement("Node1");
            writer.WriteAttributeString("att1", "value");
            writer.WriteEndElement();

            writer.WriteStartElement("Node2");
            writer.WriteString("inner text");
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
    writer.WriteEndDocument();
}

Ответ 8

Используя XmlTextWriter, вы можете отбросить результаты в StringBuilder и использовать полученную строку. Кроме того, используя XmlTextWriter, вы можете поместить контент в поток. Итак, если вы ищете гибкость, используйте XmlTextWriter.

Если вы задаете вопрос о создании xml файла путем конкатенации строк, не делайте этого. Используйте StringBuilder, если вы собираетесь разместить XML-документ вместе без какой-либо другой помощи.

Я бы не стал вручную создавать xml через "конкатенацию". Вы увеличиваете вероятность ошибок в сгенерированном xml. Классы создания Microsoft xml были протестированы довольно тщательно. Используйте это в своих интересах.