2010-02-16 6 views
2

У меня есть следующий XMLXLINQ: Отсутствует элемент в 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 имени элемента отсутствует.

я должен читать этот XML с помощью Linq для 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 
       }; 

ответ

6

Вы можете использовать факт, что есть explicit conversion from XElement to string, который возвращает null для нулевой ссылки XElement. Вы можете использовать оператор нуль-коалесцирующий идти от нуля до пустой строки:

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

hmmmm. хороший выбор – Mohsan

5

Синтаксис с «пусть 'позволяет избежать двойного запроса Элемент («имя»)

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 
      }; 
+0

Могу ли я использовать ?? для этого. это дает мне ошибку. Имя = std.Element ("name") ?? string.Empty – Mohsan

+0

@Mohsan std.Element ("name") ?? - разрешить XML-элемент, но не строку, с другой стороны string.Empty - это строка, поэтому это несовместимость типа. К сожалению, std.Element ("name"). ToString() ?? также завершится с момента NullPointerException. – Dewfy

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")) 
     }; 
Смежные вопросы