Как проверить несколько атрибутов XMLNode на нулевое значение?

Я пытаюсь прочитать несколько атрибутов из XML-файла с помощью XMLNode, но в зависимости от элемента атрибут может не существовать. Если атрибут не существует, если я попытаюсь прочитать его в памяти, он выдаст нулевое исключение. Я нашел один способ проверить, возвращает ли атрибут null:

 var temp = xn.Attributes["name"].Value;
 if (temp == null)
 { txtbxName.Text = ""; }
 else
 { txtbxName.Text = temp; }

Кажется, что это будет работать для одного экземпляра, но если я проверяю 20 атрибутов, которые могут не существовать, я надеюсь, что есть способ настроить метод, которым я могу передать значение, чтобы проверить, равно ли оно нулю. Из того, что я прочитал, вы не можете передать переменную, поскольку она инициализирована локально, но есть ли способ настроить тест, чтобы передать потенциально нулевое значение для тестирования, а затем вернуть значение, если оно не равно нулю, и вернуть "", если это нуль? Возможно ли это, или мне нужно будет тестировать каждое значение индивидуально, как указано выше?


person Fuzz Evans    schedule 31.03.2014    source источник
comment
Почему вы используете XmlDocument? Linq2XML - лучший вариант.   -  person Hamlet Hakobyan    schedule 01.04.2014
comment
Я начинаю с синтаксического анализа XML и могу работать с XMLDocument проще, чем с LINQtoSQL.   -  person Fuzz Evans    schedule 01.04.2014


Ответы (2)


Вы можете создать такой метод:

public static string GetText(XmlNode xn, string attrName)
{
    var attr = xn.Attributes[attrName];
    if (attr == null). // Also check whether the attribute does not exist at all
        return string.Empty;
    var temp = attr.Value;
    if (temp == null)
        return string.Empty;
    return temp;
}

И назовите это так:

txtbxName.Text = GetText(xn, "name");
person Markus    schedule 31.03.2014

Если вы используете XDocument, вы можете просто использовать Linq, чтобы найти все нужные узлы.

var names = (from attr in doc.Document.Descendants().Attributes()
             where attr.Name == "name"
             select attr).ToList();

Если вы по какой-то причине используете XmlDocument, вы можете выбрать нужные узлы с помощью XPath. (Мой XPath заржавел).

var doc = new XmlDocument();
doc.Load("the file");
var names = doc.SelectNodes("//[Name=\"name\"");
person Stuart Grassie    schedule 31.03.2014