我有一个返回xml的系统,我需要构建一些使用这些数据的MVC页面。我使用的是MVC 4.0和C#FW4.0。 我正在填充这样的模型:
List<PersonName> tmpList = new List<PersonName>();
IEnumerable<PersonName> PeopleNames = tmpList;
XDocument oDoc = XDocument.Parse(sResponse);
var vPeopleNames = from c in oDoc.Descendants("PersonName")
select new PersonName()
{
PersonID = (string)c.Element("PersonID"),
FirstName = (string)c.Element("FirstName"),
LastName = (string)c.Element("LastName")
};
PeopleNames = vPeopleNames;
var oModel = PeopleNames;
return View("PeopleNamesList", PeopleNames);
我想知道是否有办法自动执行此操作。我不想指定字段的名称&#34; PersonID&#34;,&#34; FirstName&#34;和&#34;姓氏&#34;。如果我有50个领域,那将太痛苦了......
答案 0 :(得分:0)
您可以借助XmlSerializer
和XNode.CreateReader()
使用XContainer.CreateWriter()
从XElement
序列化。以下扩展方法可以完成这项工作:
public static class XObjectExtensions
{
public static T Deserialize<T>(this XContainer element, XmlSerializer serializer = null)
{
using (var reader = element.CreateReader())
{
object result = (serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader);
if (result is T)
return (T)result;
}
return default(T);
}
public static XmlSerializerNamespaces NoStandardXmlNamespaces()
{
var ns = new XmlSerializerNamespaces();
ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd attributes.
return ns;
}
public static XElement SerializeToXElement<T>(this T obj)
{
return obj.SerializeToXElement(null, NoStandardXmlNamespaces()); // Disable the xmlns:xsi and xmlns:xsd attributes by default.
}
public static XElement SerializeToXElement<T>(this T obj, XmlSerializerNamespaces ns)
{
return obj.SerializeToXElement(null, ns);
}
public static XElement SerializeToXElement<T>(this T obj, XmlSerializer serializer, bool omitStandardNamespaces)
{
return obj.SerializeToXElement(serializer, (omitStandardNamespaces ? NoStandardXmlNamespaces() : null));
}
public static XElement SerializeToXElement<T>(this T obj, XmlSerializer serializer, XmlSerializerNamespaces ns)
{
var doc = new XDocument();
using (var writer = doc.CreateWriter())
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(writer, obj, ns);
var element = doc.Root;
if (element != null)
element.Remove();
return element;
}
}
然后使用它们:
var vPeopleNames = (from c in oDoc.Descendants("PersonName")
select c.Deserialize<PersonName>()).ToList();
var peopleXml = vPeopleNames.SerializeToXElement(); // Creates a root element named <ArrayOfPersonName> containing all people names as child elements.
PersonName
类的定义如下:
public class PersonName
{
public string PersonID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}