Проект № 3. Анализатор на XML документи

Даден е текстов файл със съдържание от типа на:

< таг 1 атрибут1=”стойност1” атрибут 2 =”стойност 2 ” … атрибут k =”стойност K ”>
< таг2 атрибут=”стойност”>Някакъв текст</таг2>
<таг3>Може и
на няколко реда.<таг4
атрибут5=”стойност5”></таг4>
Още текст към таг3.</таг3>
</таг 1 >

Файлът се състои от тагове, всеки таг си има:

- име
- атрибути и съответни стойности
- може да има вложени тагове
- може да има вложен ( inner) текст принадлежащ точно към този таг

Има точно един коренен таг. Можете да си мислите, че файлът се състои от стрингове оградени с ъглови скоби “<>” и други символи. Другите символи съставят inner текста на таговете. Един стринг ограден с ъглови скоби “<>” може да е отварящ за даден таг, а може и да е затварящ. При отварящия тип името на тага следва плътно символа ‘<’. Може да има whitespace ( един или повече от символите ‘ ‘, ‘ \t’, ‘\r’ и ‘\n’) навсякъде между дефинициите на отделните атрибути. Стойностите на атрибутите винаги са оградени с двойни кавички. Няма никакви символи между името на атрибут, знака ‘=’ и стойността на атрибута. Стринговете от типа на “ </ име _ на _ таг> ” не съдържат whitespace и затварят съответния таг.

Вашата задача е:

а) да построите дърво, възлите на което изглеждат например така:

class xmlAttr
{
public:
char* name;
char* value;
};

class tag
{
public:
char* name;
LList<xmlAttr> attribs;
char* innerText;
LList<tag *> innerTags;
};

б) да направите някаква редакция на съдържанието на таговете и стойностите на атрибутите по ваш избор

в) да запишете промененото XML дърво в нов файл.

Вашата основна функция би могла да изглежда така:

tag * Parse( const char * fileName );

Функцията Parse разчита съдържанието на подадения файл и построява съответно XML дърво , като връща указател към корена на дървото. Обработката на файла може да се реализира символ по символ като водещо е съдържанието между ъглови скоби. За отчитане вложеността на таговете ще се наложи използването на стек (или подобна структура, която да пази съответния таг за всяка дълбочина).

Допълнителни бележки

Можете да изпробвате вградения xml parser на повечето популярни web browser -и като запишете валиден xml в текстов файл с разширение .xml. Забележете, че директната употреба на някои символи е забранена, т.е. трябва да се escape-нат (например вместо ‘<’ и ‘>’ трябва да запишете &lt; и &gt; ). Интересно е, че съществува диалект на HTML наречен XHTML , при който HTML страницата представлява валиден XML, например:

<html>
<title>Proba title</title>
<body bgColor="white">
<p align="justify">Hello world!</p>
</body>
</html>

Последно модифициране: събота, 12 ноември 2011, 17:38