| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: vb.net und xml- Dateien (1384 mal gelesen)
|
noctis79 Mitglied Konstrukteur/ CAD-Administrator
Beiträge: 164 Registriert: 07.10.2009
|
erstellt am: 17. Jan. 2012 20:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, mal wieder ein ganz "spezielles" Problem... Vorhaben: Wir haben uns dazu entschlossen, in Zukunft FluidDraw für Pneumatikpläne einzusetzen. Dieses soll in PSP integriert werden (nur die Datei- Verwaltung)... Da es keine direkte Schnittstelle zwischen PSP und FluidDraw gibt, sollen die Attribute des Schriftfelds über den Jobserver geändert werden. Dafür müssen in der FD- Datei (eine xml- Datei) nur einige Werte geändert werden. Beim "nur" komm ich aber nicht weiter... Hier ein Auszug aus der XML- Datei: Code: <?xml version="1.0" encoding="utf-8" ?> <fluidtools2 creator="FluidDraw Professional" version="5.2.321.0" file-id="5416BB9E48CE36CF7C2E3DAF"> <section type="properties" name="19" page-number="3"> <drawing-size width="288.21989343584556" height="400.49385664405611" unit="mm" landscape="true" /> <basic-length M="1.5" unit="mm" /> <!-- Unit conversion: 1 = 0.166666666666667 M = 0.25 mm = 0.0098425197 in --> <drawing-frame src="\frm\Frame_A3.circ" inherit="true" /> <page-division row-tab-stops="16.8789533008425 201.473854439042 386.068755577241 570.663656715441 755.258557853641 939.853458991841 1124.44836013004" col-tab-stops="17.6296633102486 212.881399578136 408.133135846024 603.384872113912 798.636608381799 993.888344649683 1189.14008091757 1384.39181718546 1579.64355345335" inherit="true"> <row-descriptions>A B C D E F</row-descriptions> <col-descriptions>1 2 3 4 5 6 7 8</col-descriptions> </page-division> <designation-format-strings inherit="true" fluidic="[%IN%-][%CT%][%CM%][:%CN%]" electric="[=%IN%][+%LC%][-%CM%][:%CN%]" user-defined="[%CM%]" frame-fluidic="false" frame-electric="false" frame-user-defined="false" frame-free-input="false" /> <detailed-designation installation-id="2" /> <user-data> <attribute name="Benennung" value="Weg- und zeitabängige Steuerung" /> <attribute name="Teilenummer" value="19" /> </user-data> </section> </fluidtools2>
Jetzt soll unter <user-data> das Attribut Benennung und Teilenummer geändert werden (der Wert davon)... Im Moment lese ich die Datei als txt- Datei ein, suche mir den String und ersetze diesen durch einen neuen (Streamreader/ writer und RegularExpressions) Code: Sub Replace(ByVal Repl_String As String, ByVal Repl_by As String, ByVal temp As String) Dim Dat_String As New IO.StreamReader(temp & "FluidDraw_temp.txt") Dim Datei As String Datei = Dat_String.ReadToEnd
For Each match As Text.RegularExpressions.Match In System.Text.RegularExpressions.Regex.Matches(Datei, "attribute name=" & _ """" & Repl_String & """" & " value=" & _ """.*""") Datei = Datei.Replace(match.Value, "attribute name=" & _ """" & Repl_String & """" & " value=" & _ """" & Repl_by & """") Next Dat_String.Close() Dim Datei_new As New IO.StreamWriter("C:\work\FluidDraw_temp.txt", False) Datei_new.Write(Datei) Datei_new.Close() End Sub
Im Netz habe ich jetzt einige Beispiele für die Bearbeitung von xml- Dateien gefunden, werde daraus aber leider nicht schlau... Kann mir einer von euch weiterhelfen?!? [Diese Nachricht wurde von noctis79 am 17. Jan. 2012 editiert.] K, hier mal mein Ansatz... Nicht schön aber selten....
Code: Sub Main() Dim x0 As New Xml.XmlDocument() Dim child As Xml.XmlNode Dim childa As Xml.XmlAttribute x0.Load("C:\1.xml") For Each child In x0.DocumentElement.ChildNodes For Each childa In child.Attributes If childa.Value = "properties" Then For Each j As Xml.XmlNode In child.ChildNodes If j.Name = "user-data" Then For Each ja As Xml.XmlNode In j.ChildNodes If ja.Name = "attribute" Then Dim attri As Xml.XmlAttributeCollection = ja.Attributes If attri.ItemOf(0).Value = "Benennung" Then attri.ItemOf(1).Value = "test" End If End If Next End If Next End If Next Next x0.Save("C:\test.xml") End Sub
[Diese Nachricht wurde von noctis79 am 17. Jan. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 657 Registriert: 20.11.2006 Win7 Pro SP1 64Bit HP Z230, Core i5, 8GB RAM, nv Quadro K600 Creo Elements/Direct 19.0 M010 ModelManager 19.0 M010 clisp,VB.net,VBA,AHK,php,javascript
|
erstellt am: 17. Jan. 2012 22:58 <-- editieren / zitieren --> Unities abgeben: Nur für noctis79
Keine Ahnung, welchen Einschränkungen ihr mit Inventor unterliegt, aber vielleicht funkioniert das mittels XPath auf verständlichere Weise: Code: Imports System.Xml Imports System.Xml.XPathSub Main() Try Dim XmlStorageFile As String = "c:\test.xml" Dim XmlStoreDoc As New XmlDocument XmlStoreDoc.Load(XmlStorageFile) Dim info As XmlNode = XmlStoreDoc.DocumentElement info.SelectSingleNode("/fluidtools2/section/user-data/attribute[@name=""Benennung""]").Attributes.ItemOf(1).Value = "neue Benennung" info.SelectSingleNode("/fluidtools2/section/user-data/attribute[@name=""Teilenummer""]").Attributes.ItemOf(1).Value = "neue Teilenummer" XmlStoreDoc.Save(XmlStorageFile) Catch ex As Exception ' Abfangen bei Nichtvorhandensein End Try End Sub
------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! [Diese Nachricht wurde von Patrick Weber am 18. Jan. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Comos User Mitglied
Beiträge: 112 Registriert: 23.03.2010
|
erstellt am: 18. Jan. 2012 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für noctis79
Hallo, mann sieht es immer wieder, da wird versucht XML als Text zu behandeln. Das ist nicht der Sinn, es kommt ja auch niemand auf die Idee z.B. ein EXCEL File als Text zu behandeln. Es gibt genug kostenlose Bibliotheken und Frameworks für DOM die sich in jede Programmierumgebung einbinden lassen. Nur noch ein Zusatz zu Patricks Lösung: Code: info.SelectSingleNode("/fluidtools2/section/user-data/attribute[@name=""Benennung""]").Attributes.ItemOf("value").Value = "neue Benennung"
Dies ist auf jeden Fall robuster. Auch wenn es immer so zu seien scheint, kein Validator prüft ob das 'value' Attribut auf Position 1 steht. Die Reihenfolge der Attribute ist in XML grundsätzlich nicht relevant (deshalb haben sie ja einen Namen). Der gezielte Zugriff sollte also immer über den Namen erfolgen. Gruß Peter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noctis79 Mitglied Konstrukteur/ CAD-Administrator
Beiträge: 164 Registriert: 07.10.2009 Inventor Simulation 2011 - 64-Bit-Edition Productstream Professional Pro 2011
|
erstellt am: 18. Jan. 2012 09:18 <-- editieren / zitieren --> Unities abgeben:
Danke an Patrick und Peter! Ist mir schon klar, dass man eine xml- Datei nicht als txt- Datei behandeln sollte. Diesen Umweg habe ich nur gewählt um auf die Schnelle zu testen ob und wie FluidDraw auf eine geänderte Quelldatei reagiert. Der Aufruf der Datei im txt- Format über den FileReader ist auch nicht der sicherste da alle Vorkommen getauscht werden... Deswegen meine Anfrage nach einer eleganteren Lösung... Danke für Eure Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Technischer Redakteur (m/w/d) | TROX ist auf dem Weltmarkt führend in der Entwicklung, der Herstellung und dem Vertrieb von Komponenten, Geräten und Systemen zur Belüftung und Klimatisierung von Räumen. Mit 34 Tochtergesellschaften in 27 Ländern auf fünf Kontinenten, 20 Produktionsstätten und weiteren Importeuren und Vertretungen ist das Unternehmen in über 70 Ländern vor Ort. Aktuell erwirtschaftet die TROX GROUP weltweit mit rund 4.... | Anzeige ansehen | Technische Dokumentation |
|
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 657 Registriert: 20.11.2006
|
erstellt am: 18. Jan. 2012 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für noctis79
Zitat: Original erstellt von Comos User:
Code: info.SelectSingleNode("/fluidtools2/section/user-data/attribute[@name=""Benennung""]").Attributes.ItemOf("value").Value = "neue Benennung"
Ich hatte das gestern eigentlich auch probiert, bin aber in eine Exception gerannt. Vielleicht hatte ich auch nur einen Typo im Code... war ja schon spät. ------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|