【问题标题】:MVC 4.0 - Xml to modelMVC 4.0 - Xml 模型
【发布时间】:2015-09-06 09:42:39
【问题描述】:

我有一个返回 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);

我想知道是否有办法自动执行此操作。我不想指定字段“PersonID”、“FirstName”和“LastName”的名称。如果我有 50 个字段,那就太痛苦了……

【问题讨论】:

  • 我实际上遇到了类似的情况。除了编写一些将 XElement 映射到模型的反射代码之外,我想不出别的办法。
  • 如果你有类,你可以序列化生成 XML 的类。您还可以将 DATASET/DATTATABLE 写入 xml 格式。
  • @jdweng:如果他有 xsd/schema 文件,你的意思是,没有?
  • 我会查看XmlSerializer - 这会将 XML 映射到一个对象。如果您需要详细信息,您应该添加类定义和一些 XML。

标签: c# xml asp.net-mvc


【解决方案1】:

您可以在XNode.CreateReader()XContainer.CreateWriter() 的帮助下使用XmlSerializerXElement 序列化到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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多