NullReference в XML-операциях - PullRequest
0 голосов
/ 13 ноября 2009

Я получаю NullReferenceException при попытке прочитать атрибут xml-файла - какой атрибут читать из какого элемента определяется пользовательским вводом.

StackTrace продолжает перенаправлять меня на эту строку (помечено)

XmlDocument _XmlDoc = new XmlDocument();
_XmlDoc.Load(_WorkingDir + "Session.xml");
XmlElement _XmlRoot = _XmlDoc.DocumentElement;
XmlNode _Node = _XmlRoot.SelectSingleNode(@"group[@name='" + _Arguments[0] + "']");
XmlAttribute _Attribute = _Node.Attributes[_Arguments[1]]; // NullReferenceException

Где я упустил смысл? Какая ссылка здесь отсутствует? Я не могу понять это ...

Редактировать: элемент существует и атрибут (включая значение)

<?xml version="1.0" encoding="utf-8"?>
<session>
 <group name="test1" read="127936" write="98386" />
 <group name="test2" read="352" write="-52" />
 <group name="test3" read="73" write="24" />
 <group name="test4" read="264524" write="646243" />
</session>

Дальнейшее объяснение: _Arguments[] является разделенным массивом пользовательского ввода. Пользователь, например входы test1_read - разделены на _Arguments[0] = "test" и _Arguments[1] = "read"

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Не лучше ли использовать метод XmlElement.GetAttribute ? Это означает, что вы можете использовать XmlElement.HasAttribute , чтобы выполнить проверку, прежде чем пытаться получить к ней доступ. Это определенно позволит избежать NullReference.

Sample

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(_WorkingDir + "Session.xml");
XmlElement xmlRoot = xmlDoc.DocumentElement;
foreach(XmlElement e in xmlRoot.GetElementsByTagName("group"))
{
    // this ensures you are safe to try retrieve the attribute
    if (e.HasAttribute("name")
    { 
        // write out the value of the attribute
        Console.WriteLine(e.GetAttribute("name"));

        // or if you need the specific attribute object
        // you can do it this way
        XmlAttribute attr = e.Attributes["name"];       
        Console.WriteLine(attr.Value);    
    }
}

Также я бы посоветовал вам взглянуть на использование LinqToXml при анализе документов XML в .NET.

0 голосов
/ 13 ноября 2009

При отсутствии файла XML, который вы анализируете, я бы предположил, что, возможно, в выражении XPath вам необходимо указать //group вместо простого group.

...