При генерации 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 были протестированы довольно тщательно. Используйте это в своих интересах.