0

我正在编写一个 xml 阅读器,其中类结构将表示来自 xml 文件的数据。

例如:

<catalog>
<book id="bk101">
  <author>Gambardella, Matthew</author>
  <title>XML Developer's Guide</title>
  <genre>Computer</genre>
  <price>44.95</price>
  <publish_date>2000-10-01</publish_date>
  <description>An in-depth look at creating applications 
  with XML.</description>
</book>
</catalog> 

我怎样才能找到一个节点包含子节点!我使用了 isempty 元素方法!但我有一个例外。

 public element read(XmlReader xml)
    {
        element elem = new element();
        while (xml.Read())
        {
            if (xml.IsEmptyElement)
            {
                elem.ElemName = xml.Name;
                if (xml.HasAttributes)
                {
                    for (int i = 0; i <= xml.AttributeCount; i++)
                    {
                        xml.MoveToNextAttribute();
                        attribute attrib = new attribute();
                        attrib.AttName = xml.Name;
                        attrib.AttValue = xml.Value;
                        elem.Attributes.Add(attrib);
                    }
                }
                return elem;
            }
            else
            {
                elem.ElemName = xml.Name;

                if (xml.HasAttributes)
                {
                    for (int i = 1; i < xml.AttributeCount; i++)
                    {
                        xml.MoveToNextAttribute();
                        attribute attrib = new attribute();
                        attrib.AttName = xml.Name;
                        attrib.AttValue = xml.Value;
                        elem.Attributes.Add(attrib);
                    }
                }

                elem.subElems.Add(read(xml)); -> Object reference not set to an instance of an object.
                return elem;
            }
        }
        return elem;
    }

我使用两个类。一种称为元素,一种称为属性。我在这里做的是逐行查找,当我找到一个元素时,我创建一个元素类型对象。然后我检查该元素是否包含任何属性。如果是这样,我会为遇到的属性创建属性类型对象,并将它们添加到元素对象中的属性列表中。然后我检查子元素,如果找到,我将它们作为单独的元素对象添加到主元素对象的列表中。

  class element
{
    private String elemName;

    public String ElemName
    {
        get { return elemName; }
        set { elemName = value; }
    }
    private String elemValue;

    public String ElemValue
    {
        get { return elemValue; }
        set { elemValue = value; }
    }
    private List<attribute> attributes;

    internal List<attribute> Attributes
    {
        get { return attributes; }
        set { attributes = value; }
    }

    private List<element> SubElems;

    internal List<element> subElems
    {
        get { return SubElems; }
        set { SubElems = value; }
    }

}

class attribute
{
    private String Name;

    public String AttName
    {
        get { return Name; }
        set { Name = value; }
    }
    private String value;

    public String AttValue
    {
        get { return this.value; }
        set { this.value = value; }
    }
}
4

1 回答 1

2

创建时,element elem = new element();您永远不会将值分配给subElems,而只会分配给elem.ElemName = xml.Name。因此,您得到的结果NullReferenceException是因为在创建对象之后您拥有 subElems null。我已经重构了您的代码(请注意,我对类一无所知element

public element read(XmlReader xml)
{
    element elem = new element();
    while (xml.Read())
    {
        elem.ElemName = xml.Name;
        if (xml.HasAttributes)
        {
            for (int i = 0; i <= xml.AttributeCount; i++)
            {
                xml.MoveToNextAttribute();
                attribute attrib = new attribute();
                attrib.AttName = xml.Name;
                attrib.AttValue = xml.Value;
                elem.Attributes.Add(attrib);
            }
        }
        if (xml.IsEmptyElement)
        {   
            return elem;
        }
        else
        {
            elem.subElems = new List<element>(); //create new List of subelements
            elem.subElems.Add(read(xml)); 
            return elem;
        }
    }
    return elem;

或者

element在初始化的构造函数中定义subElemsAttributes类的

public element()
{
    this.subElems = new List<element>();
    this.Attributes = new List<attribute>();
}

或者

将您的字段声明更改为

private List<element> SubElems = new List<element>();
private List<attribute> attributes = new List<attribute>();
于 2013-01-16T09:50:40.237 回答