List 的XML序列化 – XML Root

关于Stackoverflow的第一个问题(.Net 2.0):

所以我试图返回一个List的XML,其中包含以下内容:

public XmlDocument GetEntityXml() { StringWriter stringWriter = new StringWriter(); XmlDocument xmlDoc = new XmlDocument(); XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); XmlSerializer serializer = new XmlSerializer(typeof(List)); List parameters = GetAll(); serializer.Serialize(xmlWriter, parameters); string xmlResult = stringWriter.ToString(); xmlDoc.LoadXml(xmlResult); return xmlDoc; } 

现在,这将用于我已经定义的多个实体。

说我想获得List的XML

XML将类似于:

   Tom 2   Bob 3   

获取这些实体时,有没有办法让我一直得到相同的Root?

例:

   Tom 2   Bob 3   

另请注意,我不打算将XML反序列化回List

有一个简单的方法:

 public XmlDocument GetEntityXml() { XmlDocument xmlDoc = new XmlDocument(); XPathNavigator nav = xmlDoc.CreateNavigator(); using (XmlWriter writer = nav.AppendChild()) { XmlSerializer ser = new XmlSerializer(typeof(List), new XmlRootAttribute("TheRootElementName")); ser.Serialize(writer, parameters); } return xmlDoc; } 

如果我理解正确,您希望文档的根始终是相同的,无论集合中的元素类型是什么? 在这种情况下,您可以使用XmlAttributeOverrides:

  XmlAttributeOverrides overrides = new XmlAttributeOverrides(); XmlAttributes attr = new XmlAttributes(); attr.XmlRoot = new XmlRootAttribute("TheRootElementName"); overrides.Add(typeof(List), attr); XmlSerializer serializer = new XmlSerializer(typeof(List), overrides); List parameters = GetAll(); serializer.Serialize(xmlWriter, parameters); 

对同一件事情更好的方法:

 public XmlDocument GetEntityXml() { XmlAttributeOverrides overrides = new XmlAttributeOverrides(); XmlAttributes attr = new XmlAttributes(); attr.XmlRoot = new XmlRootAttribute("TheRootElementName"); overrides.Add(typeof(List), attr); XmlDocument xmlDoc = new XmlDocument(); XPathNavigator nav = xmlDoc.CreateNavigator(); using (XmlWriter writer = nav.AppendChild()) { XmlSerializer ser = new XmlSerializer(typeof(List), overrides); List parameters = GetAll(); ser.Serialize(writer, parameters); } return xmlDoc; } 

很简单….

 public static XElement ToXML(this IList lstToConvert, Func filter, string rootName) { var lstConvert = (filter == null) ? lstToConvert : lstToConvert.Where(filter); return new XElement(rootName, (from node in lstConvert select new XElement(typeof(T).ToString(), from subnode in node.GetType().GetProperties() select new XElement(subnode.Name, subnode.GetValue(node, null))))); }