какой самый быстрый способ написать XML

Мне нужно часто создавать XML-файлы, и я выбираю XmlWrite для выполнения этой работы, я обнаружил, что он потратил много времени на такие вещи, как WriteAttributeString (в некоторых случаях мне нужно написать много атрибутов), мой вопрос: есть ли лучший способ создать файлы xml? Заранее спасибо.


person Hiber    schedule 18.04.2011    source источник
comment
Вы знаете о сериализации XML? Создайте экземпляр типа, заполните свойства, затем сериализуйте его, чтобы создать XML-документ, представляющий состояние объекта.   -  person Cheeso    schedule 18.04.2011
comment
Ты на правильном пути. XmlWriter — это самый быстрый способ записи XML.   -  person kv-prajapati    schedule 18.04.2011
comment
Определяй быстрее. Быстрее писать/отлаживать или быстрее выполнять? Ответ будет другим.   -  person Seva Alekseyev    schedule 18.04.2011
comment
Может ли быть так, что на самом деле узким местом является не WriteAttributeString, а дорогостоящий код, используемый для предоставления данных? Например, свойство, выполняющее слишком много работы при запуске, это «получить»?   -  person Jakob Möllås    schedule 18.04.2011


Ответы (6)


Самый быстрый из известных мне способов — написать структуру документа в виде простой строки и разобрать ее в объект XDocument:

string str =
@"<?xml version=""1.0""?>
<!-- comment at the root level -->
<Root>
    <Child>Content</Child>
</Root>";

XDocument doc = XDocument.Parse(str);
Console.WriteLine(doc);

Теперь у вас будет структурированный и готовый к использованию объект XDocument, который вы можете заполнить своими данными. Кроме того, вы даже можете проанализировать полностью структурированный и заполненный XML как строку и начать оттуда. Также вы всегда можете использовать структурированные XElements следующим образом:

XElement doc =
  new XElement("Inventory",
    new XElement("Car", new XAttribute("ID", "1000"),
    new XElement("PetName", "Jimbo"),
    new XElement("Color", "Red"),
    new XElement("Make", "Ford")
  )
);
doc.Save("InventoryWithLINQ.xml");

Что будет генерировать:

<Inventory>
  <Car ID="1000">
    <PetName>Jimbo</PetName>
    <Color>Red</Color>
    <Make>Ford</Make>
  </Car>
</Inventory>
person Teoman Soygul    schedule 18.04.2011
comment
Я не считаю это эффективным, поскольку вы не можете обнаружить структурные ошибки и опечатки до выполнения. - person Antoine; 18.04.2011
comment
Затем вы можете использовать структурированные объекты XElement, как в образце. - person Teoman Soygul; 18.04.2011

XmlSerializer

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

person StanislawSwierc    schedule 18.04.2011

Запишите его непосредственно в файл, например, через FileStream (через созданный вручную код). Это можно сделать очень быстро, но довольно сложно поддерживать. Как всегда, оптимизация идет с призовым тегом.

Также не забывайте, что «преждевременная оптимизация — корень всех зол».

person Jakob Möllås    schedule 18.04.2011

Использование анонимных типов и сериализация в XML — интересный подход, как упомянуто здесь

person Richard Friend    schedule 18.04.2011

Сколько времени... это 10 мс, 10 секунд или 10 минут... и сколько времени составляет весь процесс, который записывает Xml?

Не говорю, что вы не должны оптимизировать, но imo это вопрос того, сколько времени вы хотите потратить на оптимизацию этого небольшого процесса. В конце концов, чем быстрее вы хотите ехать, тем сложнее будет его поддерживать в этом случае (личное мнение).

person cyberzed    schedule 18.04.2011

Лично мне нравится использовать тип XmlDocument. При написании узлов все еще немного тяжело, но атрибуты являются однострочными и в целом проще, чем использование Xmlwrite.

person Antoine    schedule 18.04.2011