2012-06-15 4 views
2

Я пытаюсь перечислить все элементы и атрибуты xml в два отдельных объекта List.Как проверить, создан ли объект?

Мне удалось получить все элементы в xml.
Но когда я пытался добавить функциональные возможности, чтобы получить все атрибуты внутри каждого элемента, я всегда сталкиваются System.NullReferenceException: Object reference not set to an instance of an object.

enter image description here Пожалуйста, ознакомьтесь мой код ниже и сообщить, где я не делаю это правильно. Или есть лучший способ сделать это? Ваши комментарии и предложения будут высоко оценены.

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Xml; 
using System.IO; 

namespace TestGetElementsAndAttributes 
{ 
    public partial class MainForm : Form 
    { 
     List<string> _elementsCollection = new List<string>(); 
     List<string> _attributeCollection = new List<string>(); 

     public MainForm() 
     { 
      InitializeComponent(); 

      XmlDataDocument xmldoc = new XmlDataDocument(); 
      FileStream fs = new FileStream(@"C:\Test.xml", FileMode.Open, FileAccess.Read); 
      xmldoc.Load(fs); 

      XmlNode xmlnode = xmldoc.ChildNodes[1]; 

      AddNode(xmlnode); 
     } 

     private void AddNode(XmlNode inXmlNode) 
     { 
      try 
      { 
       if(inXmlNode.HasChildNodes) 
       { 
        foreach (XmlNode childNode in inXmlNode.ChildNodes) 
        { 
         foreach(XmlAttribute attrib in childNode.Attributes) 
         { 
          _attributeCollection.Add(attrib.Name); 
         } 

         AddNode(childNode); 
        } 
       } 
       else 
       { 
        _elementsCollection.Add(inXmlNode.ParentNode.Name); 
       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.GetBaseException().ToString()); 
      } 
     } 
    } 
} 

Публикация также образца XML.

<?xml version="1.0" encoding="UTF-8" ?> 
<DocumentName1> 
    <Product> 
     <Material_Number>21004903</Material_Number> 
     <Description lang="EN">LYNX GIFT MUSIC 2012 1X3 UNITS</Description> 
     <Packaging_Material type="25">457</Packaging_Material> 
    </Product> 
</DocumentName1> 
+1

убедитесь, что у вас в childNode.Attributes есть значение, не уверенное, если проблема, но 21004903, похоже, не имеет атрибута –

+1

Используйте отладчик, чтобы узнать какая переменная имеет значение null. –

+1

(Не забудьте закрыть FileStream ...) –

ответ

3

Вы должны проверить существование childNode.Attributes с чем-то вроде этого:

if (childNode.Attributes != null) 
{ 
    foreach(XmlAttribute attrib in childNode.Attributes) 
    { 
    ... 
    } 
} 
+0

Отлично! Я об этом не думал:). Моя проверка была 'if (childNode! = Null)'. – yonan2236

+0

Добро пожаловать! –

0

Вы должны убедиться, что childNode.Attributes имеет значения, так что добавить, если заявление до

if (childNode.Attributes != null) 
{ 
    foreach(XmlAttribute attrib in childNode.Attributes)