Лучший способ создать документ XML и сохранить в файл - PullRequest
1 голос
/ 02 марта 2010

У меня есть объект, из которого я хочу создать XML, каков наилучший способ сделать это в ASP.NET 3.5?

Я хочу сохранить его также в файл (веб-приложение).

Я не хочу сериализовать объект, поскольку у меня будут некоторые пользовательские имена элементов, атрибуты и значения, которые будут изменены во время создания XML.

Ответы [ 8 ]

2 голосов
/ 02 марта 2010

Сложно ответить, не зная, как «пользовательский» является «пользовательским», но LINQ-to-XML - хорошая ставка, поскольку у вас есть .NET 3.5:

// using variables here to show how the names etc can be decided at runtime
string elName = "Fred";
DateTime when = DateTime.Today;
int id = 123;
 string idName = "id";
var el = new XElement(elName, new XAttribute(idName, id), when);
el.Save("out.xml");

Предоставление xml:

<Fred id=\"123\">2010-03-01T00:00:00+00:00</Fred>

Если файл огромный , то XmlWriter может быть более эффективным, но код сложнее.

0 голосов
/ 02 марта 2010

Рассмотрите возможность создания вспомогательного класса, который использует сериализацию XML. Это отделяет форматирование XML от дизайна основного класса, и в целом соответствует идее добавления функциональности к классам посредством композиции. (Фактически, часто хорошей идеей является сделать это таким образом, даже если вспомогательный класс не использует сериализацию XML.) Он также позволяет декларативно форматировать XML без необходимости написания большого количества процедурного кода.

Как это сделать: спроектировать вспомогательный класс таким образом, чтобы он предоставлял открытые свойства способом, который нравится XmlSerializer, и получал эти значения из экземпляра вашего класса, который передается частному конструктору. Добавьте статическое свойство XmlSerializer и открытый статический метод, который использует XmlSerializer для записи данных в файл, поток или что-то еще. Что-то вроде:

[XmlRoot("MyClass")]
public class MyClassXmlWriter
{
   private static XmlSerializer Serializer = new XmlSerializer(typeof MyClassXmlWriter);

   public static void Write(MyClass source, Stream st)
   {
      Serializer.Serialize(new MyClassXmlWriter(source), st);
   }

   private MyClass Source;

   private MyClassXmlWriter(MyClass source)
   {
      Source = source;
   }

   [XmlElement("SomeElement")]
   public string SomeProperty { get { return Source.SomeProperty; } }

}

Использовать это так же просто, как:

using (FileStream fs = new FileStream(filename))
{
   MyClassXmlWriter.Write(myObject, fs);
}

Обратите внимание, что если вам когда-либо потребуется реализовать десериализацию, вы просто передаете его свойства общедоступным геттерам, а затем реализуете статический метод Read, который десериализуется в новый объект MyClassXmlWriter, а затем создает и заполняет объект MyClass из свойства. (Вы, вероятно, изменили бы название класса, хотя.)

0 голосов
/ 02 марта 2010

Почему бы не реализовать интерфейс ISerializable? Тогда вы полностью контролируете процесс сериализации ...

Смотрите примеры здесь: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx и здесь: http://msdn.microsoft.com/en-us/library/ms182342(VS.80).aspx

Вы можете комбинировать это с XmlSerializer, если у вас есть сложный объект, который нужно сериализовать, и вы не хотите писать всю сериализацию самостоятельно.

Если это просто часть объекта (т.е. некоторых свойств), для которого вы хотите выполнить специальную сериализацию, вы можете создать эти объекты, реализующие ISerializable, и изменить значение на то, что вам нужно, во время сериализации. 1013 *

0 голосов
/ 02 марта 2010

Я использовал XmlDocument до того, как узнал о сериализации.

0 голосов
/ 02 марта 2010

Вы можете использовать пространство имен System.Xml.

using System.Xml;

XmlDocument document = new XmlDocument();

XmlNode rootNode = document.CreateElement("root");
document.AppendChild(rootNode);

// Create other nodes related to your object and append them to the root node.

document.Save("path/to/your/xml/file.xml");
0 голосов
/ 02 марта 2010

Поскольку у вас будет динамический документ, я бы предложил System.Xml.Linq.XDocument для его генерации. Тогда вы просто используете XDocument.Save , чтобы сохранить его.

0 голосов
/ 02 марта 2010

Вы должны использовать System.Xml.Linq , который является самым простым способом манипулирования XML на сегодняшний день.

0 голосов
/ 02 марта 2010

Если вы не хотите сериализоваться, вы можете использовать XmlWriter .

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