3

I am trying to write an application that reads each one of the elements but if the element has subelements to read them too.I will give you an example with XML file that I have

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>

As you can see I have elements like country that have subelements(country_name,country_continent,country_government_type) where the actual information stands.So I am trying to read each one of them but it doesn't happen the way I want it to be. Here is my Sample code:

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

When I try to run it it gives me an exception on the line where foreach (XmlElement subEl in element.ChildNodes) stands. It says:

Unable to cast object of type 'System.Xml.XmlText' to type 'System.Xml.XmlElement'.

4

2 に答える 2

1

XmlElment を XmlNode に変更すると、問題が解決します。あなたの場合、特定のタグ名を持つ要素が 1 つしかないため、変数 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) を使用してみてください。

于 2013-03-05T07:09:34.843 に答える