MVC 4.0 - Xml来建模

时间:2015-09-06 09:42:40

标签: c# xml asp.net-mvc

我有一个返回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个领域,那将太痛苦了......

1 个答案:

答案 0 :(得分:0)

您可以借助XmlSerializerXNode.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; }
}