2009-11-13 5 views
0

Я получаю NullReferenceException при попытке прочитать атрибут xml-файла - какой атрибут следует читать, из какого элемента определяется пользовательский ввод.NullReference в 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 

Где я скучаю точку? Что здесь отсутствует? Я не могу понять это ...

Edit: Элемент существует и так же атрибут (включая значение)

<?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"

+0

Можете ли вы опубликовать XML-файл, который обрабатывается? – Konamiman

ответ

1

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

Образец

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

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