Autor
|
Thema: XMl Elementtext nimt Texte der Kindelemente auf (1349 mal gelesen)
|
CAD-Erlerner Mitglied Student
Beiträge: 9 Registriert: 06.10.2009 CATIA V5 P3 R19
|
erstellt am: 28. Mrz. 2010 21:06 <-- editieren / zitieren --> Unities abgeben:
Hallo CAD.de User! Mit einem VBA Makro habe ich ein xml Dokument eingelesen. Nun habe ich das Problem, dass die Elementtexte der Elternelemente automatisch die Elementtexte der Kindelemente enthalten. Wenn ich die xml Datei allerdings mit dem Internet Explorer öffne, dann enthalten die Elternelemente keinen Text, so wie es sein soll. Gibt es eine Eigenschaft die ich setzen kann, damit die Texte der Elternelemente nicht automatisch die Texte der Kindelemente aufnehmen? Ich verwende die Microsoft DOM Schnittstelle. Gruß, CAD-Erlerner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 29. Mrz. 2010 05:48 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Erlerner
|
CAD-Erlerner Mitglied Student
Beiträge: 9 Registriert: 06.10.2009 CATIA V5 P3 R19
|
erstellt am: 29. Mrz. 2010 08:40 <-- editieren / zitieren --> Unities abgeben:
Na klar! Mit folgendem Code erstelle ich eine *.xml Datei: Code:
Sub XML_Schreiben_Test()Dim xml As New DOMDocument xml.LoadXML "<Firma/>" Dim Mitarbeiter As IXMLDOMElement Set Mitarbeiter = xml.createElement("Mitarbeiter") Dim Person1 As IXMLDOMElement Set Person1 = xml.createElement("Person1") Dim Name As IXMLDOMElement Set Name = xml.createElement("Name") Name.Text = "Testname" Person1.appendChild Name Dim Abteilung As IXMLDOMElement Set Abteilung = xml.createElement("Abteilung") Abteilung.Text = "Testabteilung" Person1.appendChild Abteilung Mitarbeiter.appendChild Person1 xml.DocumentElement.appendChild Mitarbeiter xml.Save "C:\Test.xml" End Sub
Die *.xml Datei sieht dann folgendermaßen aus (im Firefox): Code:
<Firma> <Mitarbeiter> <Person1> <Name>Testname</Name> <Abteilung>Testabteilung</Abteilung> </Person1> </Mitarbeiter> </Firma>
Die Datei lasse ich mir in einem Treeview ausgeben (ab der Ebene Mitarbeiter). Dazu benutze ich folgenden Code: Code:
Dim ZSB As IXMLDOMElement Set ZSB = xml.firstChildDim Knotenliste As IXMLDOMNodeList Set Knotenliste = ZSB.childNodes Dim Knoten0 As IXMLDOMNode Dim Knoten1 As IXMLDOMNode Dim Knoten2 As IXMLDOMNode Dim Kind0 As Node Dim Text0 As Node Dim Kind1 As Node Dim Text1 As Node Dim Kind2 As Node Dim Text2 As Node 'Treeview füllen: For Each Knoten0 In Knotenliste Set Kind0 = TreeView1.Nodes.Add(, , , Knoten0.baseName) '1.Ebene For Each Knoten1 In Knoten0.childNodes Set Kind1 = TreeView1.Nodes.Add(Kind0, tvwChild, , Knoten1.baseName) Set Text1 = TreeView1.Nodes.Add(Kind1, tvwChild, , Knoten1.Text) '2.Ebene For Each Knoten2 In Knoten1.childNodes If Knoten2.nodeType = NODE_ELEMENT Then Set Kind2 = TreeView1.Nodes.Add(Kind1, tvwChild, , Knoten2.baseName) Set Text2 = TreeView1.Nodes.Add(Kind2, tvwChild, , Knoten2.Text) End If Next Next Next
Das Ergebnis dieser Ausgabe siehst du im angehängten Bild. Es scheint so, als ob die Texte von "Name" und "Abteilung" zum Text des Elements "Person1" werden. Dies möchte ich vermeiden. Auch wenn ich das Element "Person1" in die Watchlist setze besteht der Text aus den Texten der Kindelemente. Wäre super wenn jemand meinen Fehler sieht oder eine andere Lösung findet. Grüße, CAD-Erlerner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 29. Mrz. 2010 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Erlerner
Hallo , Code:
Dim ZSB As IXMLDOMElement Set ZSB = xml.firstChildDim Knotenliste As IXMLDOMNodeList Set Knotenliste = ZSB.childNodes Dim Knoten0 As IXMLDOMNode Dim Knoten1 As IXMLDOMNode Dim Knoten2 As IXMLDOMNode Dim Kind0 As Node Dim Text0 As Node Dim Kind1 As Node Dim Text1 As Node Dim Kind2 As Node Dim Text2 As Node 'Treeview füllen: For Each Knoten0 In Knotenliste Set Kind0 = TreeView1.Nodes.Add(, , , Knoten0.baseName) '1.Ebene For Each Knoten1 In Knoten0.childNodes Set Kind1 = TreeView1.Nodes.Add(Kind0, tvwChild, , Knoten1.baseName) 'Set Text1 = TreeView1.Nodes.Add(Kind1, tvwChild, , Knoten1.Text) '2.Ebene For Each Knoten2 In Knoten1.childNodes If Knoten2.nodeType = NODE_ELEMENT Then Set Kind2 = TreeView1.Nodes.Add(Kind1, tvwChild, , Knoten2.baseName) Set Text2 = TreeView1.Nodes.Add(Kind2, tvwChild, , Knoten2.Text) End If Next Next Next
Die fett markierte Zeile ist verantwortlich für deinen Fehler. Die brauchst du nicht. Du erstellst doch den Eintrag schon eine Zeile zuvor. Dieser Root-Knoten (im TreeView Element) hat aber keinen Text sondern NUR Kinder. Hab dir erstens mal mein Textscript (ganze Library) und zweitens mal einen Screenshot angehängt ------------------ MFG Daniel Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Erlerner Mitglied Student
Beiträge: 9 Registriert: 06.10.2009 CATIA V5 P3 R19
|
erstellt am: 29. Mrz. 2010 11:24 <-- editieren / zitieren --> Unities abgeben:
Hi Daniel! Danke, dass du dich so intensiv mit meinem Problem beschäftigst! Leider benötige ich diese Zeile. Bei dem Beispiel handelt es sich um einen Ausschnitt aus einer großen xml Datei (habs der Übersicht zugute gekürzt) Manche Elemente besitzen keine Unterelemente, dafür aber einen Text. Und diesen muss ich mit dieser Zeile ausgeben. Diese Elemente können aber durch das Makro wiederum Unterelemente bekommen. Deshalb kann ich die Schleife nicht prüfen lassen, ob Unterelemente vorhanden sind und falls ja -> Text nicht ausgeben. Wenn ich Elemente hinzufüge schreibt er mir übrigens deren Text auch in den Text des Mutterelements. Hast du eine Vermutung, warum er die Texte in die höhere Ebene schreibt und wie man das unterbindet? Es scheint irgendwie ein Problem mit dem DOM oder VBA zu sein, da die gespeicherte xml diese Texte nicht aufweist, auch nach erneutem abspeichern nicht. Wenn man die Zeile nicht auskommentiert dann habe ich auch mit deiner Form das gleiche Problem. Gruß, CAD-Erlerner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 29. Mrz. 2010 11:50 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Erlerner
Hallo, Zitat: Manche Elemente besitzen keine Unterelemente, dafür aber einen Text. Und diesen muss ich mit dieser Zeile ausgeben. Diese Elemente können aber durch das Makro wiederum Unterelemente bekommen. Deshalb kann ich die Schleife nicht prüfen lassen, ob Unterelemente vorhanden sind und falls ja -> Text nicht ausgeben
Das verstehe ich nicht. Du kannst doch beim ändern der *.xml ein Ereignis auslösen das dir deinen TreeView neu aufbaut. Dann kannst du die Abfrage doch machen . Wie sieht denn dein Ablauf aus? Also wie genau ist die Eingabe des Makros und was genau willst du damit erreichen bzw. was genau sollte hierbei rauskommen? Zitat: Wenn ich Elemente hinzufüge schreibt er mir übrigens deren Text auch in den Text des Mutterelements.Hast du eine Vermutung, warum er die Texte in die höhere Ebene schreibt und wie man das unterbindet? Es scheint irgendwie ein Problem mit dem DOM oder VBA zu sein, da die gespeicherte xml diese Texte nicht aufweist, auch nach erneutem abspeichern nicht.
Das ist normal wenn du das DOMObject Modell einsetzt. Hier werden alle Unterelemente auch im Root-Element im Text geführt. Dies lässt sich nicht unterbinden. Du kannst aber die DOM Funktionalität auch selber programmieren (die *.xml Datei als *.txt Datei einlesen). Hier musst du aber die vorgefertigten Klassen alle nach programmieren und das ist ein großer Aufwand. ------------------ MFG Daniel Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Erlerner Mitglied Student
Beiträge: 9 Registriert: 06.10.2009 CATIA V5 P3 R19
|
erstellt am: 29. Mrz. 2010 12:05 <-- editieren / zitieren --> Unities abgeben:
In dem Makro soll der Betrachter Anmerkungen zu einem Element aus der ersten Unterebene machen können. Diese Anmerkung wird dann dem Element als Kindelement "Anmerkung" angehängt. Damit hat dann ein Element, welches vorher keine Unterelemente hatte (dafür aber einen Text mit benötigten Informationen) nun ein Unterelement "Anmerkung", dessen Text nun leider auch im Text des Mutterelements zu sehen ist. Das Unterelement schreibe ich sofort wieder an die richtige Stelle in die xml Datei. Zum aktualisieren des Treeviews lese ich dann die neu abgespeicherte xml wieder ein und lasse sie mit der Schleife ausgeben. Das Element "Anmerkung" wird auch an der korrekten Position angezeigt, allerdings erscheint der Text wieder eine Ebene höher. Wenn du sagst, dass das beim DOM mit den Texten so ist, dann sehe ich nur noch die Möglichkeit, die Texte der ersten Unterelemente nicht auszugeben und die Informationen eine Ebene nach hinten zu setzen. Ist dann nur noch ein optisches Problem. Hast du viellleicht noch einen anderen Ansatz? Das nachprogrammieren der Schnittstelle klammer ich jetzt mal aus Gruß, CAD-Erlerner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|