我有以下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
};
答案 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"))
};