C: Как создать XML-файл с форматом по умолчанию

Я новичок в XML, и у меня есть эта информация:

box1 -> name, colour, from

box2 -> name, weight

box3 -> name, colour, from, weight

и я хочу сделать один XML файл следующим образом:

<boxName>name1
    <boxColour>colour1</boxColour>
    <boxFrom>from1</boxFrom>
</boxName>
<boxName>name2
    <boxColour>colour2</boxColour>
    <boxWeight>weight2</boxWeight>
</boxName>
<boxName>name3
    <boxColour>colour3</boxColour>
    <boxFrom>from3</boxFrom>
    <boxWeight>weight3</boxWeight>
</boxName>

Я создал свой XML, используя TinyXml в такой форме:

TiXmlDocument doc;
TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "utf-8", "");
doc.LinkEndChild( decl );
TiXmlElement* element = new TiXmlElement("boxName");
doc.LinkEndChild(element);
TiXmlText* text = new TiXmlText("name1");
element->LinkEndChild(text);
TiXmlElement* element2 = new TiXmlElement("boxColour");
TiXmlElement* element3 = new TiXmlElement("boxFrom");
TiXmlText* text2 = new TiXmlText("colour1");
TiXmlText* text3 = new TiXmlText(from1);
element->LinkEndChild(element2);
element->LinkEndChild(element3);
element2->LinkEndChild(text2);
element3->LinkEndChild(text3);
doc.SaveFile( "XML.xml" );

но проблема в том, что количество ящиков неизвестно, и каждый ящик может иметь 1,2,3 или более дочерних элементов, но формат для каждого поля и его информация такие же (как указано выше)

пожалуйста, помогите мне сделать файл XML

Я кодирую на C / API

Спасибо

Обновлять:

Я могу использовать for loop только в такой форме:

for(int i=0; i<3; i++)
{
    TiXmlElement* element2 = new TiXmlElement("element");
    TiXmlText* text2 = new TiXmlText("text");
    element->LinkEndChild(element2);
    element2->LinkEndChild(text2);
}

1: Я не могу сказать If one box have weight then use <boxWeight> tag and add <boxWeight>weight2</boxWeight> if not don't have <boxWeight></boxWeight> tag

2: У меня есть поля с информацией в буфере в такой форме:

box1 name:name1 coloure: coloure1 from: from1 Я не знаю, как разделить информацию (C / API)


person roulibic    schedule 06.05.2015    source источник
comment
В чем вопрос?   -  person ceving    schedule 06.05.2015
comment
Вопрос в том, How to create a XML file with the default format / что мне делать, чтобы решить мою проблему, у меня есть несколько ящиков, и я не знаю, сколько ящиков может быть, и я хочу сделать для них XML-файл   -  person roulibic    schedule 06.05.2015
comment
Вы когда-нибудь пробовали цикл for?   -  person ceving    schedule 06.05.2015
comment
да, но цикл, который, например, составляет 3 блока со всей информацией, я не могу сказать If the box have weight then <boxWeight>weight2</boxWeight> if not don't have this tag <boxWeight></boxWeight>   -  person roulibic    schedule 07.05.2015
comment
Я обновляю вопрос   -  person roulibic    schedule 07.05.2015
comment
@chaedrae обновление вашего вопроса - это на самом деле два новых вопроса. 1. Используйте другой оператор if. 2. узнайте, как разбирать строки C.   -  person Lydia Ralph    schedule 07.05.2015
comment
да, шина, это связанные вопросы, можно ли в конце xml файла написать?   -  person roulibic    schedule 08.05.2015


Ответы (1)


Стандартная практика, которую я видел в большинстве случаев, - это иметь файл схемы (файл XSD), в котором указывается приемлемый формат.

<xs:element name="boxName" maxOccurs="unbounded">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Colour" type="xs:myStringType"  minOccurs="0"/>
                <xs:element name="From" type="xs:date"  minOccurs="0"/>
                <xs:element name="Weight" type="xs:int" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

minOccurs означает "этот элемент является необязательным".

maxOccurs="unbounded" означает «столько, сколько необходимо».

Тогда у вас будут проверки, чтобы убедиться, что любой XML соответствует этой схеме.

Затем вы можете легко использовать цикл for:

// pseudo-code
for each box,
    if colour variable exists, create and add colour element
    if weight variable exists, create and add weight element
    if from variable exists, create and add from element
person Lydia Ralph    schedule 06.05.2015
comment
Спасибо, я кодирую на C / C ++, я не понимал, как и где использовать этот файл схемы, извините, если это плохой вопрос, это первый раз, когда я создаю файл xml - person roulibic; 06.05.2015
comment
@chaedrae Я немного отредактировал вопрос, чтобы добавить теги C / C ++, надеюсь, это привлечет больше внимания - person Lydia Ralph; 06.05.2015
comment
спасибо, я должен создать файл xsd, прежде чем писать программу, а затем читать его в программе? - person roulibic; 06.05.2015
comment
Да, обычно файл XSD существует вне вашего кода, и вы можете автоматически преобразовать его в объекты C ++, например. см. stackoverflow.com/questions/445905/xml-schema- to-c-классы - person Lydia Ralph; 06.05.2015