C # XML Вставить комментарий в XML после тега XML - PullRequest
3 голосов
/ 18 января 2010

Я использую объект C # для сериализации / десериализации XML.

Я хотел бы добавить комментарий к файлу XML во время сериализации, этот комментарий будет базовым <!-- comment --> после стандартного тега xml <?xml version="1.0" encoding="UTF-8"?>

Этот комментарий не нуждается в десериализации, он является базовым комментарием, указывающим продукт и версию, создавшую файл XML.

Ответы [ 3 ]

11 голосов
/ 18 января 2010

Вы можете сериализовать напрямую в новый XDocument , используя CreateWriter :

XDocument document = new XDocument();
document.Add(new XComment("Product XY Version 1.0.0.0"));
using (XmlWriter writer = document.CreateWriter())
{
    serializer.WriteObject(writer, graph);
}
document.Save(Console.Out);

Кроме того, вы также можете сериализовать в любой другой XmlWriter :

using (XmlWriter writer = XmlWriter.Create(Console.Out))
{
    writer.WriteStartDocument();
    writer.WriteComment("Product XY Version 1.0.0.0");
    serializer.WriteObject(writer, graph);
    writer.WriteEndDocument();
}
2 голосов
/ 18 января 2010

Сериализуйте его в XML, загрузите этот XML как XDocument (или любой другой API), вставьте комментарий и сохраните его снова. Просто и должно работать с любым API, который вы хотите использовать. Вы можете делать все это в памяти, используя MemoryStream в качестве временного хранилища.

Там может быть способом сериализации непосредственно в новый XDocument / XmlDocument, но я не знаю об этом.

0 голосов
/ 18 января 2010

Я считаю, что вы можете реализовать IXMLSeriablizable на ваших объектах. Если я правильно помню, ReadXML (читатель XmlReader) и WriteXML (писатель XmlWriter) из этого интерфейса вызываются автоматически при сериализации / десериализации (CreateSchema или любой другой третий метод не требует реализации).

Предостережение в его реализации заключается в том, что вам теперь может понадобиться реализовать его на всех связанных вложенных объектах. (т. е. если у вас есть объект Department, который содержит объекты User, и вы хотите получить комментарий к отделам, вам потребуется реализовать IXmlSeriablizable как для Department, так и для пользователя). Кроме того, поскольку вы управляете сериализацией напрямую, если вы добавляете новое свойство в класс, вам нужно будет вручную изменить методы IXmlSerializable.

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

...