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))))); }