XML中元素的子节点

时间:2013-03-03 11:52:52

标签: c# xml

我正在尝试编写一个应用程序来读取每个元素,但是如果元素有子元素也可以读取它们。我将为您提供一个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”。

2 个答案:

答案 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>()){...}