如何优化下面的代码,要求是从对象初始化事件的xml读取配置

时间:2015-04-20 23:41:29

标签: xml linq

如何优化下面的代码,要求是从对象初始化事件中的xml读取配置。

try
{
    var XMLInput = (XDocument.Load(cmdParameters["Profile"].ToString()).Descendants("Profile")
        .Select(profile => new Profile
        {
            Server = profile.Element("Server").Value,
            Publication = Convert.ToInt32(profile.Element("Publication").Value)
        })).Single();

    this.ServerName = XMLInput.Server;
    this.NumberOfPublications = XMLInput.Publication;                        
}
catch (Exception)
{
    Logger.Log(string.Format("Unable to load the Profile : {0}", cmdParameters["Profile"].ToString()));
}

如何直接将值加载到当前对象(this)中,而不是创建临时对象和加载。

2 个答案:

答案 0 :(得分:2)

您不必创建新的Profile对象。您可以直接从XElement对象获取属性值,如下所示:

var xElement = (XDocument.Load(cmdParameters["Profile"].ToString())
    .Descendants("Profile").Single();

this.ServerName = xElement.Element("Server").Value;
this.NumberOfPublications = Convert.ToInt32(xElement.Element("Publication").Value);   

请注意,此代码假定xElement对象永远不会为null。如果情况并非如此,您可能希望将Single()替换为SingleOrDefault(),并在分配值之前检查对象是否为空。

答案 1 :(得分:1)

您不必创建临时Profile对象,并直接从XElement获取所需的值,如另一个答案中所述。除此之外,您可以直接将XElement投射到int或其他类型* - 以获取int类型中元素的值:

var profile = XDocument.Load(cmdParameters["Profile"].ToString())
                       .Descendants("Profile")
                       .Single();

this.ServerName = (string)profile.Element("Server");
this.NumberOfPublications = (int)profile.Element("Publication");

* XElement的可能明确转化列表:XElement Explicit Conversion Operators