如何从.NET对象创建XML文档?

JL.*_*JL. 13 .net c# xml

我有以下接受文件名的变量:

var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None };
var xd = new XmlDocument();
xd.Load(xtr);
Run Code Online (Sandbox Code Playgroud)

我想改变它,以便我可以传入一个对象.我不想首先将对象序列化为文件.

这可能吗?

更新:

我最初的意图是获取一个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();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我正在从文件中读取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);
}
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 33

您想将任意.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;
} 
Run Code Online (Sandbox Code Playgroud)

这应该是:-)当然,您可能希望将默认的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;
}
Run Code Online (Sandbox Code Playgroud)

  • @marc_s,引用文档:`虽然Microsoft .NET Framework包含XmlReader类的具体实现,例如XmlTextReader,XmlNodeReader和XmlValidatingReader类,但在.NET Framework 2.0版中,我们建议您创建XmlReader实例使用Create方法`(http://msdn.microsoft.com/en-us/library/9khb6435.aspx).我想唯一令人信服的理由可能是,如果在.NET 7.9中它们引入了`HyperXmlReader`类,您将不需要更改代码以从中受益:-) (4认同)

Joh*_*ers 25

您可以直接序列化到XmlDocument:

XmlDocument doc = new XmlDocument();
XPathNavigator nav = doc.CreateNavigator();
using (XmlWriter w = nav.AppendChild())
{
    XmlSerializer ser = new XmlSerializer(typeof(MyType));
    ser.Serialize(w, myObject);
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*euw 7

扩展@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;
}
Run Code Online (Sandbox Code Playgroud)