Каков наилучший способ создания XML-документа в .NET? - PullRequest
3 голосов
/ 25 ноября 2008

Кажется, есть много вариантов создания XML-документа в .NET. Какой лучший подход?

Ответы [ 13 ]

5 голосов
/ 25 ноября 2008

Если вам просто нужно сгенерировать XML (без разбора или редактирования), самый быстрый способ сделать это - использовать XmlWriter (это более элегантно и быстрее, чем ваш второй пример с использованием строк и гораздо менее подвержен ошибкам, потому что вы не нужно заботиться о том, чтобы ваш документ был правильно сформирован):

// Create an XmlWriterSettings object with the correct options.
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("\t");
settings.OmitXmlDeclaration = true;

// Create the XmlWriter object and write some content.
using (var writer = XmlWriter.Create("data.xml", settings))
{
    writer.WriteStartElement("book");
    writer.WriteElementString("item", "tesing");
    writer.WriteEndElement();
    writer.Flush();
}

Если у вас уже есть объектная модель для сериализации, вы можете подумать об использовании XmlSerializer, который, однако, - по крайней мере из моего опыта - намного медленнее, чем XmlWriter, и его легко использовать только на простых объектных моделях.

4 голосов
/ 25 ноября 2008

Альтернативным методом является использование сериализации Xml: просто создайте классы, представляющие ваши (сложные) элементы, заполните открытыми свойствами, представляющими содержимое этих элементов, возможно, предоставьте дополнительную информацию о макете с помощью атрибутов: [XmlElement ()] , [XmlAttribute ()], ... И используйте XmlSerializer для создания документа:

public class Car
{
  public string Make;
  public string Model;
}


public class Cars
{
  [XmlElement("Car")]
  public Car[] cars;
}


class Program
{
  public static void Save(Cars cars, string sFilename)
  {
    try
    {
      XmlSerializer ser = new XmlSerializer(cars.GetType());
      FileStream fs = new FileStream(sFilename, FileMode.Create);
      ser.Serialize(fs, cars);
      fs.Close();
    }
    catch (Exception ex)
    { // Failed to save data to disk.
      Debug.WriteLine(string.Format("Failed to save contents of {0}: {1}", sFilename ,ex.Message));
    }
  }
}
4 голосов
/ 25 ноября 2008

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

Я бы использовал DOM API только в крайнем случае. Как говорит Джон, LINQ to XML - это еще один путь. Однако, что бы вы ни делали, не возвращайтесь к форматированию строк, так как есть тонкости, такие как пространства имен, цитирование сущностей, цитирование атрибутов и т. Д., Которые вам необходимо получить.

4 голосов
/ 25 ноября 2008

Я бы лично использовал LINQ to XML, если бы мог. Это намного лучше, чем DOM API. Конечно, это зависит от того, используете ли вы .NET 3.5 ...

Обратите внимание, что ваше решение String.Format не работает, если у вас есть текст, который нужно экранировать. По общему признанию, я не могу думать ни о каких марках автомобилей и моделях, включая & или < и т.д., но в более общем случае это реальная проблема.

2 голосов
/ 12 февраля 2009

Используйте образец PasteXmlAsLinq из Visual Studio 2008. Откройте C: \ Program Files \ Microsoft Visual Studio 9.0 \ Samples \ 1033 \ CSharpSamples.zip и извлеките файлы LinqSamples \ PasteXmlAsLinq. Файл Readme рассказывает, как его настроить и использовать.

1 голос
/ 25 ноября 2008

Я еще не сделал этого, но XML Literal VB .

0 голосов
/ 12 февраля 2009

Использовать строку для каждого компонента документа. Значения для документа вставляются String.Format, затем LoadXml преобразует это в XmlDocument:

string carString =
  "<Car>" +
  "  <Make>{0}</Make>" +
  "  <Model>{1}</Model>" +
  "</Car>";
XmlDocument carDoc = new XmlDocument();
carDoc.LoadXml(String.Format(carString, make, model));
0 голосов
/ 12 февраля 2009

Используйте только API и используйте множество методов CreateElement, AppendChild и т. Д.:

XmlNode carNode = xmlDocument.CreateElement("Car");
xmlDocument.DocumentElement.AppendChild(carNode);
XmlNode makeNode = xmlDocument.CreateElement("Make");
carNode.AppendChild(makeNode);
...
0 голосов
/ 12 февраля 2009

Использовать Типизированные шаблоны XML из MVP.XML.

0 голосов
/ 25 ноября 2008

Текущий проект, над которым я работаю, у меня есть много информации, которую нужно сохранить в формате xml. Вместо того, чтобы продолжать использовать какой-либо из методов, определенных выше, я создал свою собственную оболочку, которая выполняет всю работу за меня. Я бы порекомендовал вам сделать то же самое. Приложите усилия один раз и используйте их снова и снова. Я большой поклонник Fluent Interface и поэтому мой API работает соответственно. Вот пример

        List<string> hierarchyList = new List<string>();
        hierarchyList.Add("Book");
        hierarchyList.Add("Product");
        ConfigurationManager manager = new ConfigurationManager();
        manager.FileName = "deleteme.xml";

        expression = new ConfigurationManagerExpression(manager);
        expression.AddNode("HierarchySet");

        // ROOT_NODE_CONSTANT is the root node of document
        string nodePath = manager.ROOT_NODE_CONSTANT + "/HierarchySet";

        foreach (string name in hierarchyList)
        {
            expression.UsingNode(nodePath).AddNode("HierarchyName").AssignValue(name);
        }

        string panelPrefix = "PE";
        string pathWithFileName = "define your path here";
        manager.SaveSettings(pathWithFileName );
Let me know if you need code and I"ll post it on my blog (which I need to do eventually).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...