Przekstzałcenie XML do drzewa

0

Jak w temacie, mam problem z przekształceniem pliku opartego o format XML do drzewa. Plik ma następującą strukturę:

<node=20>
	<node=10>
		<node=5>
		</node>
	</node>
	<node=200>
	</node>
</node>

Mam problem z wymyśleniem jakiegoś sensownego algorytmu, który zrobi z tego pliku faktyczne drzewo w pamięci programu... Wiem, że problem jest prawdopodobnie trywialny, ale może ktoś pomoże? Nie proszę o gotowy kod, tylko o schemat algorytmu... Próbowałem już wymyśleć coś iteracyjnie, rekurencyjnie, ale w każdym moim pomyśle jest taki moment, który sprawia, że algorytm nie działa dla każdego przypadku poprawnie...

Ps. plik programu może mieć oczywiście inny układ węzłów, to jest plik przykładowy.

Dodam tylko, że to projekt na zaliczenie przedmiotu i nie mogę korzystać z parserów XML nie swojej roboty... A takiego nie stworzyłem...

0

Serio aż taki problem?

Coś w tym stylu sprawdzałeś?

root := CreateRootNode()
current := root
while xml_tag <- read {
    if xml_tag is start {
        node := CreateNode(xml_tag)
        current.addChild(node)
        current = node
    }
    if xml_tag is start_end {
        node := CreateNode(xml_tag)
        current.addChild(node)
    }
    if xml_tag is end {
        current = current.parent()
    }
}
return root
0

Dzięki Ci bardzo, napisałem ten kod w C i działa... Nie wiedzieć dlaczego nie potrafiłem sobie tego wyobrazić... Jeszcze raz serdecznie dziękuję.
Zamieszczam kod dla potomnych.

struct node *parseFileToTree(char *path) {
    FILE *file = fopen(path, "r");
    struct node *root = createNode(-1);
    struct node *current = root;
    int value;
    char line[256];

    while (fgets(line, 256, file) != NULL) {
        if (isStart(line) == true) {
            sscanf(line, "%*[^0123456789]%i", &value);
            struct node *node = createNode(value);
            addChild(&current, node);
            current = node;
        }
        if (isEnd(line) == true) {
            current = current->parent;
        }
    }
    fclose(file);
    return root->left;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1