# Wie XML-Hierachielevel auslesen und Elemente durchsuchen -> tinyxml (c++ xml parser)



## unknown7 (20. November 2009)

Hi, ich möchte eine XML datei einlesen und tinyxml als parser nutzen.
Ich finde allerdings nicht die stelle, an der er die hirachie feststellt. Diese interessiert mich am meisten. Ich möchte also das ganze erst als Objekt haben und etwas verändern. Dann in eine Datei schreiben.
Mein Problem ist, ich weiß nicht, wie ich die hirachie auslesen kann. Und wie ich genau nach nachbarn suche bzw. eins tiefer gehe wenn möglich. Das funktioniert alles schon, allerdings finde ich trotz debuggen nicht wo.

Allerbesten dank.
gruß, unknown



Beispiel: es kann bleiebig viele prod id's geben. Also beliebig viele Elemente mit unterelemnten

so sieht die XML file aus. Also ein Baum, der verschiedene hirachie level hat.
--
  |
  |----
  |    |-------
  |    |-------
  |              |---------
  |----

Beispiel:

```
- <prod id="12345">
	  <produkt_id>987</product_id> 
	  <version_description /> 
	  <irgendwas /> 
	  <typ>Auto</typ> 
	  <owner>Vater, Johan</owner> 
		- <owner_substitutes>
		  <substitute_name>Max, Musteman</substitute_name> 
		  <substitute_name>Mino, Musterfrau</substitute_name>
		  <substitute_name>ABC, DEF</substitute_name> 
		</owner_substitutes>
		- <product_workflow>
		  <product_workflow_name>SMS</product_workflow_name> 
		</product_workflow>
	- <visibility>
		  <visibility_group /> 
	  </visibility>
  </prod>
```


----------



## ComFreek (20. November 2009)

Ich weiß, dass das keine Antwort auf deine Frage ist, aber da du damit schon arbeitest:

Kann man tinyxml auch *kostenlos* für kommerzielle Zwecke verwenden?


----------



## deepthroat (21. November 2009)

Hi.

@ ComFreek: TinyXML steht unter der zlib Lizenz. Also: ja, man darf es in kommerziellen Anwendungen verwenden (und muss seinen Code* nicht* freigeben oder unter eine  bestimmte Lizenz stellen). \edit: Ach ja, und es kostet auch nichts. 

@ unknown7: Ich verstehe nicht ganz was du meinst. Was genau willst du denn machen? Grundsätzlich verwendet TinyXML das Visitor Pattern. Oder du könntest XPath Ausdrücke verwenden.

Gruß


----------



## unknown7 (24. November 2009)

Hi,
also ich möchte wissen wo bzw. wie (befehl) ich von einer xml datei

1.) nachbarn lesen
2.) 1 stufe runter gehen kann

____
es funktioniert shcon in der testausgabe, aber ich finde selbst beim debuggen nicht, wo er das macht.
Also wie stellt man fest ob es nachbarn gibt und wenn auslesen bzw. ob es tiefere knoten gibt und diese nachbarn haben.

danke,
gruß unknwon7


----------



## deepthroat (24. November 2009)

unknown7 hat gesagt.:


> Hi,
> also ich möchte wissen wo bzw. wie (befehl) ich von einer xml datei
> 
> 1.) nachbarn lesen
> ...


Die PreviousSibling, NextSibling, FirstChild Methoden der TiXmlNode Klasse hast du wohl übersehen?

Gruß


----------



## unknown7 (24. November 2009)

zu meiner schande, doch genau darum geht es. Ich komme damit nicht klar.

also nachbarn lese ich folgendermaßen aus:

for( itemElement = topElement->FirstChildElement(); itemElement; itemElement = itemElement->NextSiblingElement() )
{
      printf("%s\n", itemElement->GetText());
}


wie kann ich aber sagen dass er auch tiefer gehen soll. klar ich kann noch ein ->FirstChildElement() einbauen, aber ich möchte, dass er alles selber findet. Also auch, wenn es 100 ebenen der hirachi gibt, dafür kann ich nicht 100 mal das ganze machen. und in jeder ebene soll er wieder nach nachbarn suchen.

Sollte nicht soo schwer sein... aber klappen will es trotzdem nicht bei mir :-(

besten dank für die hilfe!

gruß,
unknown7


----------



## deepthroat (25. November 2009)

unknown7 hat gesagt.:


> zu meiner schande, doch genau darum geht es. Ich komme damit nicht klar.
> 
> also nachbarn lese ich folgendermaßen aus:
> 
> ...


Nochmal die Frage: warum willst du das machen? Irgendeinen Sinn muss es ja haben; also das Ziel der ganzen Aktion. Evlt. gibt es eine bessere Methode dafür.


```
TiXmlNode* node = document.RootElement();

while (node) {
  doSomething(node);

  if (node->FirstChildElement()) {
    node = node->FirstChildElement();
  } else {
    if (node->NextSiblingElement()) {
      node = node->NextSiblingElement();
    } else {
      while (node = node->Parent()) {
         if (node->NextSiblingElement()) {
             node = node->NextSiblingElement();
             break;
         }
      }
    }
  }
}
```
Gruß

PS: Bitte verwende für deine Codeschnipsel die Code-Tags.


----------



## unknown7 (25. November 2009)

Frage:
warum willst du das machen?

Antwort:
Ich möchte daten aus einer Datenbank auslesen und in eine XML datei einfügen. Dafür muss ich wissen, welche einträge schon in der XML datei stehen. Ich muss mehr als nur titel betrachten, sondern auch versionsnummern etc.

Die XML datei wird später in einer anderen Datenbank hochgeladen. Diese hat nicht den gleichen Aufbau wie die erste Datenbank, daher kann man nur bedingt dinge übernehmen.

Ich muss alles auslesen und die hirachie beibehalten, das verarbeiten mache ich dann schon.
Aber ich brauche die Objekte mit Hirachie um sie zu vergleichen und falls der 1. Datenbankauslesemechanismus neue und upgedatete informationen liefert möchte ich diese in die XML datei schreiben. Auch diese müssen hiraisch zugeordnet werden!

Ich hoffe ich konnte alle unklarheiten beseitigen, besten dank so weit. Wenn du eine bessere Methode kennst, immer her damit 

gruß unknown7


----------



## unknown7 (25. November 2009)

so jetzt registriert ;-)
ja also ich denke, dass es eigentlich bestimmt eine fertige klasse für sowas gibt.
Die Daten msus ich auch so wieder in eine XML datei parsen können, also wäre eine map oder ähnliches wohl das sinnvollste. Evtl. mehrdimensionales array. Aber ich muss da dann ja auch immer extra prüfen wieviele unterelemente es gibt. Bin mir noch nicht so wirklich sicher was hier die beste Lösung ist.

Vorallem bräuchte ich, wenn es geht, eben auch etwas zum zurück parsen in die XML Datei.

Besten Dank nochmals,
gruß unknown7


----------

