如何检查节点是否有子元素
本文关键字:是否 元素 节点 何检查 检查 | 更新日期: 2023-09-27 17:53:27
我正在编写一个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; }
}
}
当您创建element elem = new element();
时,您永远不会将值分配给subElems
,只分配给elem.ElemName = xml.Name
。因此,结果你得到NullReferenceException
,因为在子belem你有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
的构造函数中定义subElems
和Attributes
的初始化,如
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>();