AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML Codeerstellung

Ein Thema von mikenrw · begonnen am 7. Mär 2006 · letzter Beitrag vom 11. Mär 2006
Antwort Antwort
mikenrw

Registriert seit: 9. Okt 2005
11 Beiträge
 
#1

XML Codeerstellung

  Alt 7. Mär 2006, 16:28
Hi,

das Problem mit den xml Attributen habe ich Dank der netten Unterstützung hier hinbekommen. Habe jetzt folgendes Problem, wahrscheinlich easy für die Erfahrenen.

Folgender XML Baum, den ich als einzelnen Zweig hinbekomme.


mro/conceptGrp/languageGrp/termGrp/term


Ca. 10 x erscheint der Baum angefangen mit languageGrp usw. ,dann geht es mit conceptGrp weiter usw. Mein Problem: die Namen sind alle gleich´, ist so vorgegeben. Wie kann ich gleiche Zweignamen unter .Net anlegen ? Mit SelectSingleNode wird alles unter dem ersten Eintrag angehängt.

Für eure Hilfe vielen Dank im Voraus.

Mike
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: XML Codeerstellung

  Alt 7. Mär 2006, 19:59
Es wäre hilfreich, wenn du mal das Konzept erklärst, das hinter dem Ganzen steckt. Ich habe bis jetzt nur begriffen, dass du diverse Knoten in einer XML-Datei hast, in denen irgendwas gespeichert wird. Dass es diese Knoten(namen) mehrfach in der XML-Datei geben kann, ist an sich nicht das Problem und hat auch nichts mit "selectSingleNode" zu tun.

Ich weiß auch nicht, wer dieses Dateiformat vorgegeben hat und inwieweit der- oder diejenige für Anpassungen offen ist. Ich werfe daher gern noch mal die Serializer-Idee von Master_BB in den Raum. Die ist, so wie ich das bisher (ohne weitere Informationen) beurteilen kann, vielleicht gut geeignet, und der Code zum Schreiben und Lesen von XML-Datei <-> Klasse reduziert sich auf eine Handvoll Zeilen.


Edit: Link repariert.
  Mit Zitat antworten Zitat
mikenrw

Registriert seit: 9. Okt 2005
11 Beiträge
 
#3

Re: XML Codeerstellung

  Alt 8. Mär 2006, 09:32
Hi,

danke für die schnelle Antwort.
Also ich versuch es mal.
Master BB hat zwar Recht, doch ab delphi 2005 geht es auch einfacher, ohne die Serialisierung, die macht Delphi. Ich schreibe für private Zwecke eine Konvertierungsroutine die eine csv Datei mit mehreren Daten, die jeweils 10 DB Felder haben, nach xml. Diese werden so gespeichert wie angegeben. Das habe ich mir so nicht überlegt. Wie kann man gleiche node Names mit den gleichen Unterverzeichnisüberschriften denn hinzufügen ? Wenn ich das Verzeichnis wechsle, um Knoten anzulegen, dann legt er die unter dem ersten Knoteneintrag an.

Mike
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: XML Codeerstellung

  Alt 8. Mär 2006, 10:53
Vermutlich, weil du mit "selectSingleNode" einen Knoten suchst, der den gewünschten Aufbau hat. Das Problem dabei ist, dass deine Knoten alle den gleichen Aufbau haben, und dass "selectSingleNode" nur den ersten gefundenen berücksichtigt. Kein Wunder also, dass alles im ersten Knoten landet.

Oder um es anders zu sagen: Zeig doch bitte mal etwas von deinem Code und deinen bisherigen Klassen in deinem Programm.
  Mit Zitat antworten Zitat
mikenrw

Registriert seit: 9. Okt 2005
11 Beiträge
 
#5

Re: XML Codeerstellung

  Alt 8. Mär 2006, 15:27
Hi,

Du hast 100% Recht. DAS ist das Prob.

Hier der Code.

Danke.

Mike



Globale Variablen:
var
xmldoc : XmlDocument;
root : XmlNode;
node : XmlNode;

procedure create_xml;
const
lang_Source_1 ='us-en';
lang_Target_1 ='de';
atrfield1 ='Source';
dataset1 ='red';
dataset2 ='rot';
begin
xmldoc := XmlDocument.Create;
root := xmldoc.CreateElement('mro');
xmldoc.AppendChild(root);
node := xmldoc.CreateElement('conceptGrp');
root.AppendChild(node);
node1 := root.SelectSingleNode('conceptGrp');
node1.AppendChild(xmldoc.CreateElement('languageGr p'));
node1 := root.SelectSingleNode('conceptGrp/languageGrp');
node1.AppendChild(xmldoc.CreateElement('language') );
node1 := root.SelectSingleNode('conceptGrp/languageGrp/language');

//ATTRIBUTE
node1.Attributes.Append(xmldoc.CreateAttribute('TY PE')).InnerText := atrfield1;
node1.Attributes.Append(xmldoc.CreateAttribute('LA NG')).InnerText := lang_Source_1;

node1.AppendChild(xmldoc.CreateElement('termGrp')) ;
node1.AppendChild(xmldoc.CreateElement('term')).In nerText := dataset1;

//´2.: BAUM

node2 := root.SelectSingleNode('conceptGrp');
//node2 := root.SelectNodes('conceptGrp');
node2.AppendChild(xmldoc.CreateElement('languageGr p'));
//AB HIER FEHLERHAFT
//node1:= root.SelectNodes('conceptGrp/languageGrp',xmlnodelist);
//node1 := root.SelectSingleNode('conceptGrp/languageGrp');
//node1.AppendChild(xmldoc.CreateElement('language') );
node1.AppendChild(xmldoc.CreateElement('language') );
//node1 := root.SelectSingleNode('conceptGrp/languageGrp/language');

//ATTRIBUTE
node1.Attributes.Append(xmldoc.CreateAttribute('TY PE')).InnerText := atrfield1;
node1.Attributes.Append(xmldoc.CreateAttribute('LA NG')).InnerText := lang_Target_1;

node1.AppendChild(xmldoc.CreateElement('termGrp')) ;
node1.AppendChild(xmldoc.CreateElement('term')).In nerText := dataset2;

xmldoc.Save('g:\mro.xml');

end;
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: XML Codeerstellung

  Alt 8. Mär 2006, 15:33
Würdest du dir bitte noch angewöhnen, deinen Quellcode in [delphi]-Tags zu klammern.
Danke.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7

Re: XML Codeerstellung

  Alt 8. Mär 2006, 16:03
Um übrigens noch die Frage zu beantworten:
Zitat von mikenrw:
Delphi-Quellcode:
node1 := root.SelectSingleNode('conceptGrp'); // <-- !!!
node1.AppendChild(xmldoc.CreateElement('languageGrp'));
node1 := root.SelectSingleNode('conceptGrp/languageGrp'); // <-- !!!
node1.AppendChild(xmldoc.CreateElement('language'));
node1 := root.SelectSingleNode('conceptGrp/languageGrp/language'); // <-- !!!
Bitte beachte, dass "node1" durch die Zuweisungen
node1 := natürlich nicht mehr auf den <conceptGrp>-Knoten zeigt. Wenn du dann später natürlich weitere Knoten per
Zitat:
node1.AppendChild(xmldoc.CreateElement('language'));
einhängst, wundert mich überhaupt nicht, dass sie im falschen Teil landen.

Du solltest dir also wirklich Gedanken über einen anderen Ansatz machen. Dein momentaner Weg ist zum einen fehlerbehaftet, und bei mehr als 10 Knoten auch noch enorm umständlich. Wenn du schon keine Serialisierung nutzen kannst oder willst (weißt du eigentlich, was das ist?), dann schreibe dir wenigstens Funktionen, die die gewünschten Knoten erstellen und dir vllt. den neu erzeugten Knoten als Ergebnis zurückliefern. Das würde den Code vereinfachen.
  Mit Zitat antworten Zitat
mikenrw

Registriert seit: 9. Okt 2005
11 Beiträge
 
#8

Re: XML Codeerstellung

  Alt 9. Mär 2006, 18:22
Hi,


Großartige Hilfe. Außer Arroganz, steht hier nicht viel.
Frage: Wie stelle ich eine Doppelvergaseranlage ein?.
Deine Antwort wäre: „Dreh mal an den Schrauben. Weißt du eigentlich was ein Vergaser ist?“.
Antworte nicht, wenn Du keine Lust hast.

Mike
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: XML Codeerstellung

  Alt 9. Mär 2006, 18:40
Bist Du Schwede? Alter Schwede! MathiasSimmack hat vollkommen Recht und ist nicht arrogant.
Erstens hat er Dir Fehler in deinem Code aufgezeigt und zweites solltest Du das XML in eine Klasse packen: Die Frage ist auch berechtigt ('Weist Du überhaupt...'). Ich würde mir bei einem XLM mit bekanntem Schema einen Wrapper basteln (lassen). Bei D6E ist ein so ein Tool dabei. Einfach XML-Datei angeben, ein bisserl rumklicken und -wupps- hat man die fertige Klasse. Dann die XML-Daten einlesen (1.Zeile) und direkt auf die Elemente zugreifen (2.Zeile).

Weiterhin gibt es diverse Tools für lau im Web. Kennst Du Google? Oder www.torry.net? (Sorry, den konnte ich mir hinsichtlich des Doppelvergasers nicht verkneifen).

Übrigens schraube ich nicht an Doppelvergasern rum, denn ich weiss nicht was das ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: XML Codeerstellung

  Alt 11. Mär 2006, 11:34
Zitat von mikenrw:
Großartige Hilfe. Außer Arroganz, steht hier nicht viel.
Tut mir leid, dass du das so auffasst. Aber ich habe dir die Fehler deines Codes gezeigt. Ich wusste nicht, dass ich dir auch das eigene Denken abnehmen soll. Wie dem auch sei, ich fasse noch mal zusammen:

Du erstellst eine XML-Datei, indem du erst den Grundbaum inkl. erstem Knoten erzeugst. Und dann den zweiten, vermutlich den dritten, usw. Das ist zu umständlich. Wenn ich mehrere gleiche Knoten in einer XML-Datei speichern möchte und (aus welchen Gründen auch immer) keinen Wrapper/Serializer nutzen möchte, dann schreibe ich mir eine entsprechende Hilfsfunktion, der ich den Parentknoten und ggf. das XML-Dokument übergebe. In der Art wie
Delphi-Quellcode:
function TBla.CreateXmlNode(ParentNode: IXMLDOMNode; XmlDoc: DomDocument;
  Attr1Value, Attr2Value: string): IXMLDOMNode;
begin
  // den gewünschten Knoten lokal erzeugen
  Result := XmlDoc.CreateElement(...);

  // ggf. Attribute und dergleichen erzeugen
  { ... }

  // neuen Knoten ggf. gleich einhängen
  ParentNode.AppendChild(Result);
end;
Das ist nur ein Beispiel. Ich behaupte jetzt einfach mal, dass du einen Knoten mit zwei Attributen erzeugst, und Grundlage für die Attribute (sprich: Values) sind die zwei Stringvariablen im Funktionskopf. Damit würde sich deine Schreibarbeit im Code schon mal enorm reduzieren. Mal angenommen, du hast den Grundcode der XML-Datei bereits fertig, dann könnte das so aussehen:
Delphi-Quellcode:
self.CreateXmlNode(ConceptGrpNode, xmldoc, Edit1.Text, Edit2.Text);
self.CreateXmlNode(ConceptGrpNode, xmldoc, Edit3.Text, Edit4.Text);
{ ... }
Du siehst, was ich meine? Dieser Ansatz ließe sich noch weiter optimieren. Damit könntest du deinen Programmcode einfacher gestalten, ohne irgendwelche Wrapper oder Serializer zu nutzen. Aber wie bereits alzaimar schrieb, mit einem Wrapper (oder eben einem .NET-Serializer) lässt sich die Arbeit noch weiter vereinfachen.

Im Prinzip war dein größter Fehler (und das ist nicht böse gemeint!) einfach nur, dass du die Variable "node1" mehrfach verwendet und innerhalb von 5 Programmzeilen neu zugewiesen hast. Natürlich landen die neuen Knoten dann an einer falschen Stelle. Zumindest für deinen Hauptknoten solltest du also eine eigene Variable nutzen, etwa wie ich im Beispiel mit "ConceptGrpNode". Allzu sparsam sollte man also auch nicht mit Variablen umgehen, wenn man etwas bestimmtes erreichen will.

Zitat:
Antworte nicht, wenn Du keine Lust hast.
Tue ich nicht mehr. Keine Sorge.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz