0

我一直在为大学做一些事情

是为了保存一些东西,我选择 tinyxml 这样做

TiXmlDocument doc;
TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "", "");
doc.LinkEndChild(decl);
TiXmlElement* cm = new TiXmlElement("CocktailMachine");
doc.LinkEndChild(cm);

TiXmlElement* disp = new TiXmlElement("dispensers");
cm->LinkEndChild(disp);
TiXmlElement* cock = new TiXmlElement("cocktails");
cm->LinkEndChild(cock);
TiXmlElement* ingr = new TiXmlElement("ingredients");
cm->LinkEndChild(ingr);






for (size_t i = 0; i < dispensers.size(); i++)
{
    stringstream ss;
    ss << i;
    string s = ss.str();
    TiXmlElement* x_disp = new TiXmlElement(s.c_str());
    disp->LinkEndChild(x_disp);
    x_disp->SetAttribute("number", dispensers.at(i)->get_number());
    if (dispensers.at(i)->get_ingredient() == NULL) {

        x_disp->SetAttribute("ingredient", "NULL");

    }
    else {


        x_disp->SetAttribute("ingredient", dispensers.at(i)->get_ingredient()->get_name().c_str());

    }

}


if (cocktails.size() != 0)
    for (size_t i = 0; i < cocktails.size(); i++)
    {


        stringstream ss;
        ss << i;
        string s = ss.str();
        TiXmlElement* ct = new TiXmlElement(s.c_str());
        cock->LinkEndChild(ct);
        ct->SetAttribute("name", cocktails.at(i)->get_name().c_str());

        for (size_t j = 0; j < cocktails.at(i)->get_ingredients().size(); j++)
        {

            stringstream ss;
            ss << j;
            string s = ss.str();
            TiXmlElement* ct_s = new TiXmlElement(s.c_str());
            ct->LinkEndChild(ct_s);

            ct_s->SetAttribute("ingredient", cocktails.at(i)->get_ingredients().at(j)->get_name().c_str());
        }

    }



if (ingredients.size() != 0)
    for (size_t i = 0; i < ingredients.size(); i++)
    {
        stringstream ss;
        ss << i;
        string s = ss.str();
        TiXmlElement* x_ingr = new TiXmlElement(s.c_str());
        ingr->LinkEndChild(x_ingr);
        x_ingr->SetAttribute("name", ingredients.at(i)->get_name().c_str());

    }


doc.SaveFile("CM.xml");
doc.Clear();

这会将一些东西保存到 CM.xml

<?xml version="1.0" ?>
<CocktailMachine>
    <dispensers>
        <0 number="1" ingredient="NULL" />
        <1 number="2" ingredient="NULL" />
        <2 number="3" ingredient="NULL" />
        <3 number="4" ingredient="NULL" />
        <4 number="5" ingredient="NULL" />
        <5 number="6" ingredient="NULL" />
    </dispensers>
    <cocktails>
        <0 name="Tequila Sunrise">
            <0 ingredient="Tequila" />
            <1 ingredient="Orange juice" />
            <2 ingredient="Grenadine" />
        </0>
        <1 name="tq2">
            <0 ingredient="Tequila" />
            <1 ingredient="Orange juice" />
            <2 ingredient="Grenadine" />
        </1>
    </cocktails>
    <ingredients />
</CocktailMachine>
(不是我知道的代码,但这是发布 xml 的唯一方法)

当我尝试用这个加载它时

TiXmlDocument* doc = new TiXmlDocument("example1.xml");
if (!doc->LoadFile())
    cout << "false";

它总是返回 false

尝试加载“helloworld.xml”工作正常

<?xml version="1.0" ?>
<Hello>World</Hello>

那么我的 xml 的问题在哪里?

在此先感谢 Jonny0815

4

2 回答 2

2

这是问题所在:<0 number="1" ingredient="NULL" />

您不能将数字作为标签名称。

于 2016-11-05T13:35:45.017 回答
1

非常感谢解决了我的问题伙计们:D

“ 0 不是有效的 XML 名称”

有一个美好的周末

OT:新来的……我可以将问题标记为“已回答”或“已完成”或打开关闭请求,以便一切都保持有序吗?

于 2016-11-05T13:41:08.790 回答