Чтение во всех элементах родного брата с TinyXML - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема с чтением файла XML!Приведенный ниже код предназначен для извлечения детских значений (страны) из XML-файла, однако мне нужно будет пройти через всех братьев и сестер (все три страны), и мне нужно решение, которое работает также с неопределенным числом братьев и сестер.Мой XML-файл выглядит следующим образом:

<?xml version="1.0"?>
<data>
    <country name ="Liechteinstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

И у меня есть код, подобный этому:

XMLDocument doc;
doc.LoadFile("test.xml");
tinyxml2::XMLElement* countryElement = doc.FirstChildElement("data")->FirstChildElement("country");


ofstream myfile;
myfile.open("result.txt", ios::out | ios::app );
    for (tinyxml2::XMLElement* child = countryElement->NextSiblingElement()->FirstChildElement(); child != NULL; child = child->NextSiblingElement())
    {
        myfile << child->GetText() << endl;
    }
    myfile.close();

Это читает все значения первой страны, но мне нужно прочитатьи записать в текстовый файл все три значения страны.Я попытался использовать для цикла, чтобы пройти через братьев и сестер, добавив

countryElement = countryElement->NextSiblingElement() в конце цикла, но это не сработало.Может ли кто-нибудь помочь мне, пожалуйста?Заранее спасибо!

1 Ответ

0 голосов
/ 19 февраля 2019

Я бы предложил две петли.Один для обхода стран, а другой для обхода соседей внутри:

int main() {
    tinyxml2::XMLDocument doc;
    doc.LoadFile("test.xml");
    tinyxml2::XMLElement* dataElement = doc.FirstChildElement("data");

    std::ofstream myfile;
    myfile.open("result.txt", std::ios::out | std::ios::app);

    for (tinyxml2::XMLElement* countryElement = dataElement->FirstChildElement("country");
        countryElement != NULL; countryElement = countryElement->NextSiblingElement())
    {
        myfile << "Country name: " << countryElement->Attribute("name") << std::endl;
        myfile << "Rank: " << countryElement->FirstChildElement("rank")->GetText() << std::endl;
        myfile << "Year: " << countryElement->FirstChildElement("year")->GetText() << std::endl;
        myfile << "gdppc: " << countryElement->FirstChildElement("gdppc")->GetText() << std::endl;

        for (tinyxml2::XMLElement* child = countryElement->FirstChildElement("neighbor");
            child != NULL; child = child->NextSiblingElement())
        {
            myfile << "Neighbor: " << child->Attribute("name") << std::endl;
        }
        myfile << std::endl;
    }
    myfile.close();
}

Вывод:

Country name: Liechteinstein
Rank: 1
Year: 2008
gdppc: 141100
Neighbor: Austria
Neighbor: Switzerland

Country name: Singapore
Rank: 4
Year: 2011
gdppc: 59900
Neighbor: Malaysia

Country name: Panama
Rank: 68
Year: 2011
gdppc: 13600
Neighbor: Costa Rica
Neighbor: Colombia
...