Как создать XML-документ из объекта .NET? - PullRequest
12 голосов
/ 31 марта 2010

У меня есть следующая переменная, которая принимает имя файла:

var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None };
var xd = new XmlDocument();
xd.Load(xtr);

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

Возможно ли это?

Обновление:

Мои первоначальные намерения заключались в том, чтобы взять документ xml, объединить некоторый xslt (сохраненный в файле), затем вывести и вернуть html ... вот так:

public string TransformXml(string xmlFileName, string xslFileName)
{
     var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None };
     var xd = new XmlDocument();
     xd.Load(xtr);

     var xslt = new System.Xml.Xsl.XslCompiledTransform();
     xslt.Load(xslFileName);
     var stm = new MemoryStream();
     xslt.Transform(xd, null, stm);
     stm.Position = 1;
     var sr = new StreamReader(stm);
     xtr.Close();
     return sr.ReadToEnd();
}

В приведенном выше коде я читаю в xml из файла. Теперь я хотел бы просто поработать с объектом, прежде чем он будет сериализован в файл.

Итак, позвольте мне проиллюстрировать мою проблему, используя код

public string TransformXMLFromObject(myObjType myobj , string xsltFileName)
{
     // Notice the xslt stays the same.
     // Its in these next few lines that I can't figure out how to load the xml document (xd) from an object, and not from a file....

     var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None };
     var xd = new XmlDocument();
     xd.Load(xtr);
}

Ответы [ 3 ]

32 голосов
/ 31 марта 2010

Вы хотите превратить произвольный объект .NET в сериализованную строку XML? Нет ничего проще! : -)

public string SerializeToXml(object input)
{
   XmlSerializer ser = new XmlSerializer(input.GetType(), "http://schemas.yournamespace.com");
   string result = string.Empty;

   using(MemoryStream memStm = new MemoryStream())
   {
     ser.Serialize(memStm, input);

     memStm.Position = 0;
     result = new StreamReader(memStm).ReadToEnd();
   } 

   return result;
} 

Это должно быть сделано :-) Конечно, вы также можете сделать пространство имен XML по умолчанию настраиваемым в качестве параметра.

Или вы хотите иметь возможность создать XmlDocument поверх существующего объекта?

public XmlDocument SerializeToXmlDocument(object input)
{
   XmlSerializer ser = new XmlSerializer(input.GetType(), "http://schemas.yournamespace.com");

   XmlDocument xd = null;

   using(MemoryStream memStm = new MemoryStream())
   {
     ser.Serialize(memStm, input);

     memStm.Position = 0;

     XmlReaderSettings settings = new XmlReaderSettings();
     settings.IgnoreWhitespace = true;

     using(var xtr = XmlReader.Create(memStm, settings))
     {  
        xd = new XmlDocument();
        xd.Load(xtr);
     }
   }

   return xd;
}
22 голосов
/ 31 марта 2010

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

XmlDocument doc = new XmlDocument();
XPathNavigator nav = doc.CreateNavigator();
using (XmlWriter w = nav.AppendChild())
{
    XmlSerializer ser = new XmlSerializer(typeof(MyType));
    ser.Serialize(w, myObject);
}
6 голосов
/ 08 августа 2017

Расширяя решение @JohnSaunders, я написал следующую обобщенную функцию:

public XmlDocument SerializeToXml<T>(T source) {
    var document = new XmlDocument();
    var navigator = document.CreateNavigator();

    using (var writer = navigator.AppendChild()) {
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(writer, source);
    }
    return document;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...