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;
    }

私は2つのクラスを使用しています。1 つは要素と呼ばれ、もう 1 つは属性と呼ばれます。ここで行っているのは、1 行ずつ進み、要素を見つけたら要素型オブジェクトを作成することです。次に、その要素に属性が含まれているかどうかを確認します。その場合、遭遇した属性の属性タイプ オブジェクトを作成し、それらを要素オブジェクト内の属性リストに追加します。次に、サブ要素をチェックし、見つかった場合は、それらを個別の要素オブジェクトとしてメイン要素オブジェクトのリストに追加します。

  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 があるため、結果として得られます。私はあなたのコードをリファクタリングしました (私はクラスについて何も知らないことに注意してください)subElemselem.ElemName = xml.NameNullReferenceExceptionnullelement

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 に答える