XLINQ: отсутствует элемент в XML - PullRequest
2 голосов
/ 16 февраля 2010

у меня есть следующий 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 to 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 ]

6 голосов
/ 16 февраля 2010

Вы можете использовать тот факт, что существует явное преобразование из XElement в string, которое возвращает ноль для нулевой ссылки XElement. Затем вы можете использовать оператор объединения нулей, чтобы перейти от нуля к пустой строке:

var stds = from std in doc.Descendants("student")
           select new
           {
               ID = std.Element("id").Value,
               Name = (string) std.Element("name") ?? "";
           };
5 голосов
/ 16 февраля 2010

Синтаксис с '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
            };
1 голос
/ 30 мая 2013

Это немного поздно, но может помочь кому-то еще, просматривая это. У меня был довольно большой объект с 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"))
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...