我正在尝试编写一个应用程序来读取每个元素,但是如果元素有子元素也可以读取它们。我将为您提供一个XML文件示例
XML:
<fci>
<dog_breeds>
<dog_breed standart_number="SN207" group="GR9" section="S9.8">
<name>Пекинез</name>
<country country_code="CHN" capital="Beijing" official_language="Chinesse" time_zone = "UTC/GMT +8 hours" currency="Chinese Yuan">
<country_name>Китай</country_name>
<country_continent>Азия</country_continent>
<country_government_type>Комунистически щат</country_government_type>
</country>
<year_of_establishment>1904</year_of_establishment>
<head>
Голяма, пропорционално по-широка, отколкото дълбока.
Череп: Широк, широк и плосък между очите; не купловиден; широк между ушите.
Стоп: Ясно изразен.
</head>
<teeth>
Равни устни, без да се показват зъбите или езика. Здравата долна челюсът е от съществено значение.
</teeth>
<ears>
Със сърцевидна форма, поставени на нивото на черепа, носени плътно по главата и недостигащи под линията на муцуната. Дълъг пищен украсяващ косъм.
</ears>
<eyes>
Големи, ясни, кръгли, тъмни и сияещи. Без видими очни проблеми.
</eyes>
<tail>
Високо поставена, носи се плътно прилепнала, леко извита върху едната от двете страни на гърба. Дълъг украсяващ косъм.
</tail>
<colors>
<primary_color> Всички цветове и петна се допустими и еднакво ценени, с изключение на албинизъм или чевенокафяв цвят</primary_color>
<secondary_color> Всички цветове и петна се допустими и еднакво ценени, с изключение на албинизъм или чевенокафяв цвят</secondary_color>
<prefered_color> Всички цветове и петна се допустими и еднакво ценени, с изключение на албинизъм или чевенокафяв цвят</prefered_color>
</colors>
<fur>
Косъм: Козината е дълга, права, с обилна грива, простираща се извън холката, образуваща пелерина около шията. Груб покривен косъм с дебел, по-мек подкосъм. Украсяващ косъм по ушите, задната страна на крайниците, опашката и пръстите.Дължината и количеството на козината не трябва да помрачават очертанията на тялото.
</fur>
<image>https://skydrive.live.com/redir?resid=6F26B1E0D6CF648E!291</image>
<size>
<males_size>При тази порода единствено теглото се взима под внимание</males_size>
<females_size></females_size>
</size>
<weight>
<males_weight>5 кг</males_weight>
<females_weight>5.4 кг</females_weight>
</weight>
</dog_breed>
</fci>
正如你所看到的,我有像国家这样的元素有子元素(country_name,country_continent,country_government_type)所在的实际信息站。所以我试着读它们中的每一个,但它不会按照我想要的方式发生是。 这是我的示例代码:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("D:....\\ASP_fifth_xml_file.xml");
XmlNodeList elementsList = xdoc.GetElementsByTagName("country");
for (int i = 0; i < elementsList.Count; i++)
{
foreach (XmlElement element in elementsList[i].ChildNodes)
{
richTextOutput_TextBox.Text += element.Name +":"+ element.InnerText+"\n";
if (element.HasChildNodes)
{
foreach (XmlElement subEl in element.ChildNodes)
{
richTextOutput_TextBox.Text += subEl.Name + ":" + subEl.InnerText + "\n";
}
}
}
richTextOutput_TextBox.Text += "\n \n \n";
}
当我尝试运行它时,它在foreach (XmlElement subEl in element.ChildNodes)
所代表的行上给出了一个例外。它说:
无法将“System.Xml.XmlText”类型的对象强制转换为“System.Xml.XmlElement”。
答案 0 :(得分:1)
将XmlElment更改为XmlNode将解决此问题。 在您的情况下,由于您只有一个具有特定标记名称的元素,因此变量elementsList将是单个节点,for循环不是必需的。
XmlDocument xdoc = new XmlDocument();
xdoc.Load("D:....\\ASP_fifth_xml_file.xml");
XmlNode node = xdoc.SelectSingleNode("//country");
foreach (XmlNode element in node.ChildNodes)
{
richTextOutput_TextBox.Text += element.Name + ":" + element.InnerText + "\n";
if (element.HasChildNodes)
{
foreach (XmlNode subEl in element.ChildNodes)
{
richTextOutput_TextBox.Text += subEl.Name + ":" + subEl.InnerText + "\n";
}
}
richTextOutput_TextBox.Text += "\n \n \n";
}
如果问题仍然存在,请尝试使用隐式类型变量(var)。
答案 1 :(得分:0)
您的ChildNodes包括文本节点。如果要忽略它们,请使用OfType&lt; XmlElement&gt;()
foreach (XmlNode subEl in element.ChildNodes.OfType<XmlElement>()){...}