| |
VB.NET - Ein- und UmsteigerXML Node aus Variable | | | Autor: Badenzer | Datum: 07.09.10 19:41 |
| Hi,
wie kann ich einen XML Node, den ich in einer Variablen habe, angeben?
Module Module1
Dim XDoc1 As XDocument = XDocument.Load("Z:\temp\config.xml")
Sub Main()
Dim filelist() As String = Split(XDoc1.<files>.<filelist>.Value, ";")
For i = 1 To filelist.Length
XDoc1.<files>.< & filelist(i) & >.<fields>.value '<------- das hier
' funktioniert nicht
Next
Dim fileContents As String
fileContents = My.Computer.FileSystem.ReadAllText("Z:\Temp\PACK.TXT")
Dim variable() As String = Split(fileContents, "", , _
CompareMethod.Text)
Console.WriteLine(variable.Length)
End Sub
End Module Ich hoffe es ist verständlich was ich meine, ich weiß grad nicht wie ich es beschreiben soll...
Gruß
Badenzer | |
Re: XML Node aus Variable | | | Autor: Badenzer | Datum: 09.09.10 08:03 |
| kann mir jemand gute Tutorials zu diesem Thema empfehlen? | |
Re: XML Node aus Variable | | | Autor: Badenzer | Datum: 09.09.10 19:33 |
| Ich möchte Dateien parsen, welche in etwa so aufgebaut sind:
06.09.2010 Packing time stamp _
data 1
+------------------------------------------------------------------------------_
----------------------------------------------------------------------+-
+------------------------------------------------------------------------------_
----------------------------------------------------------------------+
|Object key Msg. Created on Time Proc.date Prc.time _
User name DSN ODev |
+------------------------------------------------------------------------------_
----------------------------------------------------------------------+
|1404929279 ZSD1 03.09.2010 04:50:46 00.00.0000 00:00:00 _
USER2 E1T9 |
|1622120448 ZSD1 03.09.2010 01:53:56 03.09.2010 05:05:38 _
USER1 E1T2 |
|1404928944 ZSD1 03.09.2010 03:05:08 03.09.2010 04:19:29 _
USER2 E1T6 |
|1404928945 ZSD1 03.09.2010 03:05:08 03.09.2010 04:18:31 _
USER5 E1T7 |
|1622120555 ZSD1 03.09.2010 03:05:29 03.09.2010 03:43:38 _
USER1 E1T7 |
|1622120556 ZSD1 03.09.2010 03:05:29 03.09.2010 03:46:43 _
USER2 E1T7 |
|1622120557 ZSD1 03.09.2010 03:05:29 03.09.2010 03:43:51 _
USER1 E1T9 |
|1404929422 ZSD1 03.09.2010 06:59:13 03.09.2010 07:11:56 _
USER1 E1T6 |
|1622120485 ZSD1 03.09.2010 02:04:54 03.09.2010 02:50:26 _
USER4 E1T9 | Im XML würde ich gerne hinterlegen welches Feld an welcher Position steht und wie lang dieses Feld ist.
Das XML sieht im Moment so aus:
<?xml version="1.0" encoding="utf-8" ?>
<files>
<filelist>PACK.TXT</filelist>
<PACK.TXT>
<fields>9</fields>
<field01>Object_key,2,10</field01>
<field02>Msg,33,4</field02>
<field03>Created_on,38,10</field03>
<field04>Time,49,8</field04>
<field05>Proc_date,58,10</field05>
<field06>Prc_time,69,8</field06>
<field07>User_name,78,12</field07>
<field08>DSN,91,6</field08>
<field09>ODev,98,7</field09>
</PACK.TXT>
</files> Wenn weiter Dateien geparst werden sollen kommt der Dateiname ins Node <filelist>. Zusätzlich wir ein Node <DATEINAME> mit Childnodes erstellt, welche die benötigten Informationen beinhalten.
Ich hoffe ich habe einigermaßen verständlich ausgedrückt, was ich vorhabe.
P.S. leider verschiebt der code-Tag im Forum den Auszug aus dem File einbisschen. Ein Datensatz = eine Zeile.
Grüße
Badenzer | |
Re: XML Node aus Variable | | | Autor: DaveS (Moderator) | Datum: 09.09.10 20:50 |
| Also, erstens (sei bitte nicht beleidigt falls du daran beteiligt warst) ist das ziemlich beispielhaft für schlechte Xml. Damit kann man kaum mit Xml-Werkzeugen sinnvoll umgehen, und gar nicht ohne fremde Sachen wie String.Split() zu verwenden. Sowas wäre meiner Meinung nach wesentlich besser
<?xml version="1.0" encoding="utf-8" ?>
<files >
<file name='PACK.TXT' fieldCount='9'>
<field>Object_key,2,10</field>
<field>Msg,33,4</field>
<field>Created_on,38,10</field>
...
</file>
<file name='...'>
...
</file>
...
</files> Da ist alles einfacher und einheitlich und man kann viel leichter Xml-mäßig Abfragen erstellen. (fieldCount ist in der Tat auch überflüssig weil man mit XPath ganz leicht die Anzahl der Unterelemente feststellen kann). Eventuell wäre es vorteilhaft Attribute auch für die field-Elemente zu verwenden, wie name=, start=, length=, zB. Das wäre sowas wie <field name='Object_key' start='2' length='10' />. Sonst muss man umständlich Werte aus filelist holen und splitten, man weiß nicht wie die Elemente heißen ohne die Anzahl zu kennen, und die Namen wie file01 sind sowieso überflüssig, da sie sich ohnehin aus der Reihenfolge ergeben. Stell dir vor du willst alle Felder für dateiName=xxx bekommen und du weißt nicht mal wie die Felder heißen. So umgeschrieben kann man leicht XmlDocument und XPath einsetzen. ZB alle Felder einer Datei so auflisten
Dim xd As New XmlDocument
xd.Load("C:\Users\Testuser\Test\files.xml")
For Each file As XmlNode In xd.SelectNodes( _
"//files/file[@name='PACK.TXT']/field")
Debug.WriteLine(String.Format("Name={0}, start={1}, length={2}", _
file.Attributes("name").Value, file.Attributes("start").Value, _
file.Attributes("length").Value))
Next Das sieht denn so aus:
Name=Object_key, start=2, length=10
Name=Msg, start=33, length=4
Name=Created_on, start=38, length=10 Ich weiß natürlich nicht was Sinn der Sache ist (irgendwie etwas schwer zu begreifen) und was du dann mit der Xml anstellen willst um konkret weitere Vorschläge zu machen. Bei allem Respekt vor dem versuchten Einsatz von modischer Xml sollte man vielleicht zuerst einigermassen damit vertraut sein bevor man mit dem Entwurf von Xml Schemas anfängt. Sonst wird man sehr wahrscheinlich mit wesentlichen Problemen bei der späteren Bearbeitung konfrontiert.
(geändert: fileCount sollte fieldCount sein).
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
Re: XML Node aus Variable | | | Autor: Badenzer | Datum: 09.09.10 21:43 |
| Also, erstens (sei bitte nicht beleidigt falls du daran beteiligt warst) ist das ziemlich beispielhaft für schlechte Xml.
Auch wenn ich nicht nur beteiligt, sondern sogar ganz alleine dran war, bin ich bestimmt nicht beleidigt
Das ist das erste Projekt bei dem ich XML einsetze und bin mir sicher das dies nicht der erste Fehler sein wird, der mir passiert.
Ich weiß natürlich nicht was Sinn der Sache ist (irgendwie etwas schwer zu begreifen) und was du dann mit der Xml anstellen willst um konkret weitere Vorschläge zu machen.
Ich versuche das mal zu beschreiben...
Ich habe ca. 20 Textfiles, die mir täglich zur Verfügung gestellt werden. Die Informationen in diesen Dateien muss ich in eine Datenbank importieren. Da die Formatierung dieser Dateien nicht wirklich ideal für einen Import sind, muss ich sie zuerst ein bisschen aufbereiten (z.B. wäre es recht gut ein CSV-File daraus zu generieren)
Die XML-Datei (config.xml) soll mir helfen flexibel zu beiben. Es kann ja sein das irgendwann eine neue Datei, die verarbeitet werden muss, hinzukommt.
Ich bin für deine Hilfe wirklich sehr dankbar und werde morgen deinen Lösungsvorschlag ausprobieren.
Wenn du Quellen hast, die mir beim "verstehen" und verarbeiten von XML helfen, bin ich natürlich sehr dankbar wenn du mir diese sagst
Gruß Badenzer | |
Re: XML Node aus Variable | | | Autor: DaveS (Moderator) | Datum: 10.09.10 09:45 |
| Der Ansatz ist natürlich sinnvoll. Wie du mit XmlDocument und XPath die Werte für eine bestimmte Datei bekommst (mit meiner vorgeschlagenen Xml) habe ich schon gezeigt. Aber hier nochmal
Dim xmlFile As String = "D:\Test\xmlFile.xml"
Dim fileName As String = "PACK.TXT" Dim xd As New XmlDocument
xd.Load(xmlFile)
For Each fn As XmlNode In xd.SelectNodes("files/file[@name='" & fileName & _
"']/field")
Debug.WriteLine(String.Format("Name={0}, start={1}, length={2}", _
fn.Attributes("name").Value, fn.Attributes("start").Value, _
fn.Attributes("length").Value))
Next Und um deine ursprüngliche Frage zu beantworten, so kann man es mit XDocument machen (es gäbe viele Lösungen).
Dim xdoc As XDocument = XDocument.Load(xmlFile)
Dim fields = xdoc.<files>.<file>.Where(Function(x) x.Attribute("name") = _
fileName).<field>
(oder auch
Dim fields = (From elem In xdoc.<files>.<file> Where elem.@name = _
fileName).<field>
)
For Each field In fields
Debug.WriteLine(String.Format("Name={0}, start={1}, length={2}", _
field.Attribute("name").Value, field.Attribute("start").Value, _
field.Attribute("length").Value))
Next Meine xml:
<?xml version="1.0" encoding="utf-8" ?>
<files>
<file name='PACK.TXT'>
<field name='Object_key' start='2' length='10' />
<field name='Msg' start='33' length='4' />
<field name='Created_on' start='38' length='10' />
</file>
<file name='PACK1.TXT'>
<field name='Object_key1' start='2' length='10' />
<field name='Msg1' start='33' length='4' />
<field name='Created_on1' start='38' length='10' />
</file>
</files> ________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|