XLINQ:xml中缺少元素

时间:2010-02-16 12:18:05

标签: linq-to-xml

我有以下xml

<students>
  <student>
    <id>12</id>
    <name>Mohsan</name>
  </student>
  <student>
    <id>2</id>    
  </student>
  <student>
    <id>3</id>
    <name>Azhar</name>
  </student>
</students>

请注意,缺少2个名称元素。

我必须使用Linq to XML

阅读此xml

我使用以下代码来吸引所有学生..

请建议我改进此代码

var stds = from std in doc.Descendants("student")
                select new
                {
                    ID = std.Element("id").Value,
                    Name = (std.Element("name")!=null)?std.Element("name").Value:string.Empty
                };

3 个答案:

答案 0 :(得分:6)

您可以使用explicit conversion from XElement to string的事实,它为null XElement引用返回null。然后,您可以使用null-coalescing运算符从null转到空字符串:

var stds = from std in doc.Descendants("student")
           select new
           {
               ID = std.Element("id").Value,
               Name = (string) std.Element("name") ?? "";
           };

答案 1 :(得分:5)

使用'let'语法可以避免两次询问Element(“name”)

var stds = from std in doc.Descendants("student")
            let elName = std.Element("name") 
            select new
            {
                ID = std.Element("id").Value,
                Name = (elName!=null)?elName.Value:string.Empty
            };

答案 2 :(得分:1)

这有点晚了,但可以帮助其他人看一看。我有一个相当大的对象,有90个属性,我试图从XML文件中插入,所以为了方便起见,我创建了一些方法。

    private static object CheckElement(XElement element)
    {
        return string.IsNullOrEmpty((string)element) ? null : element.Value;
    }

    public static string CheckElementString(XElement element)
    {
        return (string)CheckElement(element);
    }

    public static Int16 CheckElementInt(XElement element)
    {
        var theResult = CheckElement(element);

        return theResult == null ? (short)-1 : Convert.ToInt16(theResult);
    }

    public static DateTime? CheckElementDateTimeNullable(XElement element)
    {
        var theResult = CheckElement(element);

        return theResult == null ? (DateTime?)null : DateTime.Parse(theResult.ToString());
    }

    public static decimal CheckElementDecimal(XElement element)
    {
        var theResult = CheckElement(element);

        return theResult == null ? 0.00M : Convert.ToDecimal(theResult);
    }

    public static bool CheckElementBoolean(XElement element, bool defaultValue)
    {
        var theResult = CheckElement(element);

        return theResult == null ? defaultValue : Convert.ToBoolean(theResult);
    }

然后这很容易使用:

    var stds = from std in doc.Descendants("student")
        select new
        {
            ID = std.Element("id").Value,
            Name = CheckElementString(std.Element("name"))
        };