![]() |
XML Codeerstellung
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 |
Re: XML Codeerstellung
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 ![]() Edit: Link repariert. |
Re: XML Codeerstellung
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 |
Re: XML Codeerstellung
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. |
Re: XML Codeerstellung
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; |
Re: XML Codeerstellung
Würdest du dir bitte noch angewöhnen, deinen Quellcode in [delphi]-Tags zu klammern.
Danke. |
Re: XML Codeerstellung
Um übrigens noch die Frage zu beantworten:
Zitat:
Delphi-Quellcode:
natürlich nicht mehr auf den <conceptGrp>-Knoten zeigt. Wenn du dann später natürlich weitere Knoten per
node1 :=
Zitat:
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. |
Re: XML Codeerstellung
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 |
Re: XML Codeerstellung
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 ![]() Übrigens schraube ich nicht an Doppelvergasern rum, denn ich weiss nicht was das ist. |
Re: XML Codeerstellung
Zitat:
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:
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:
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;
Delphi-Quellcode:
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.
self.CreateXmlNode(ConceptGrpNode, xmldoc, Edit1.Text, Edit2.Text);
self.CreateXmlNode(ConceptGrpNode, xmldoc, Edit3.Text, Edit4.Text); { ... } 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. :wink: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz