C# 将对象列表序列化到XDocument

C# 将对象列表序列化到XDocument,c#,xml,serialization,linq-to-xml,C#,Xml,Serialization,Linq To Xml,我正试图使用以下代码将对象列表序列化到XDocument中,但我收到一个错误,指出“不能将非空白字符添加到内容中。” " public XDocument GetEngagement(MyApplication) { ProxyClient客户端=新的ProxyClient(); 列表工程师; List allEngs=新列表(); foreach(application.applicators中的申请人应用程序) { engs=新列表(); Engages=client.getEngages(

我正试图使用以下代码将对象列表序列化到XDocument中,但我收到一个错误,指出“不能将非空白字符添加到内容中。” "

public XDocument GetEngagement(MyApplication)
{
ProxyClient客户端=新的ProxyClient();
列表工程师;
List allEngs=新列表();
foreach(application.applicators中的申请人应用程序)
{
engs=新列表();
Engages=client.getEngages(“myConnString”,app.SSN.ToString());
allEngs.AddRange(英语);
}
DataContractSerializer ser=新的DataContractSerializer(allEngs.GetType());
StringBuilder sb=新的StringBuilder();
System.Xml.XmlWriterSettings xws=new System.Xml.XmlWriterSettings();
xws.OmitXmlDeclaration=true;
xws.Indent=true;
使用(System.Xml.XmlWriter xw=System.Xml.XmlWriter.Create(sb,xws))
{
ser.WriteObject(xw,allEngs);
}
返回新的XDocument(sb.ToString());
}

我做错了什么?是不是
XDocument
构造函数不接受对象列表?如何解决这个问题?

XDocument的ctor需要其他对象,如XElement和XAttribute。请看一下文档。您要查找的是XDocument.Parse(…)

以下各项也应适用(未经测试):


现在,无需使用StringBuilder即可直接写入文档。应该快得多。

我想最后一行应该是

 return XDocument.Parse(sb.ToString());
而且,完全删除序列化程序可能是个好主意,从
列表中直接创建XDoc应该很容易。这让你可以完全控制结果

大致:

var xDoc = new XDocument( new XElement("Engagements", 
         from eng in allEngs
         select new XElement ("Engagement", 
           new XAttribute("Name", eng.Name), 
           new XElement("When", eng.When) )
    ));

我是这样做的

private void button2_Click(object sender, EventArgs e)
{
    List<BrokerInfo> listOfBroker = new List<BrokerInfo>()
    {
    new BrokerInfo { Section = "TestSec1", Lineitem ="TestLi1" },
    new BrokerInfo { Section = "TestSec2", Lineitem = "TestLi2" },
    new BrokerInfo { Section = "TestSec3", Lineitem ="TestLi3" }
    };

    var xDoc = new XDocument(new XElement("Engagements",
        new XElement("BrokerData",
     from broker in listOfBroker

     select new XElement("BrokerInfo",
       new XElement("Section", broker.Section),
       new XElement("When", broker.Lineitem))
    )));

    xDoc.Save("D:\\BrokerInfo.xml");
}

public class BrokerInfo
{
    public string Section { get; set; }
    public string Lineitem { get; set; }
}
private void按钮2\u单击(对象发送者,事件参数e)
{
List listOfBroker=新列表()
{
新的BrokerInfo{Section=“TestSec1”,Lineitem=“TestLi1”},
新的BrokerInfo{Section=“TestSec2”,Lineitem=“TestLi2”},
新BrokerInfo{Section=“TestSec3”,Lineitem=“TestLi3”}
};
var xDoc=新XDocument(新XElement(“约定”),
新XElement(“BrokerData”,
来自listOfBroker中的经纪人
选择新XElement(“BrokerInfo”,
新条款(“条款”,经纪人条款),
新XElement(“When”,broker.Lineitem))
)));
xDoc.Save(“D:\\BrokerInfo.xml”);
}
公共类BrokerInfo
{
公共字符串部分{get;set;}
公共字符串行项{get;set;}
}

谢谢,我会尝试一下,几分钟后回复您。这是一种扩展方法,因此您必须在代码中添加“using System.Xml.XPath”。感谢您的帮助,我会尝试一下,几分钟后回复您。好的,请参阅我对XDocument的XElement inst的编辑。在我看来,“手动”序列化对象是个坏主意。无论何时发生更改,都必须维护序列化代码。只要可能,我会选择XMLSerializer。它为您提供了大部分模板代码,但如果您需要自定义功能,它很容易调整。@Achim:你说得对,但我认为它处于序列化和“存储为XML”的边缘。嗨,Dona bhatt,欢迎。请考虑增加更多信息。
var xDoc = new XDocument( new XElement("Engagements", 
         from eng in allEngs
         select new XElement ("Engagement", 
           new XAttribute("Name", eng.Name), 
           new XElement("When", eng.When) )
    ));
private void button2_Click(object sender, EventArgs e)
{
    List<BrokerInfo> listOfBroker = new List<BrokerInfo>()
    {
    new BrokerInfo { Section = "TestSec1", Lineitem ="TestLi1" },
    new BrokerInfo { Section = "TestSec2", Lineitem = "TestLi2" },
    new BrokerInfo { Section = "TestSec3", Lineitem ="TestLi3" }
    };

    var xDoc = new XDocument(new XElement("Engagements",
        new XElement("BrokerData",
     from broker in listOfBroker

     select new XElement("BrokerInfo",
       new XElement("Section", broker.Section),
       new XElement("When", broker.Lineitem))
    )));

    xDoc.Save("D:\\BrokerInfo.xml");
}

public class BrokerInfo
{
    public string Section { get; set; }
    public string Lineitem { get; set; }
}