Autor Beitrag
vreden123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Di 09.07.13 14:31 
Hallo ich habe eine Textdatei mit folgendem Inhalt:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<folder>
   <subfolder></subfolder>
   <folderid>f797b19a-e848-45b9-98e8-a33202b612b8</folderid>
   <parentfolderid>00000000-0000-0000-0000-000000000000</parentfolderid>
</folder>
<folder>
   <subfolder>/Ausbildungsnachweise</subfolder>
   <folderid>68688162-ea1d-4974-9e4f-6af497d5cc2f</folderid>
   <parentfolderid>f797b19a-e848-45b9-98e8-a33202b612b8</parentfolderid>
</folder>
<folder>
   <subfolder>/Ausbildungsnachweise/April</subfolder>
   <folderid>6ac972bd-e78e-403a-9bf5-fc6be062144f</folderid>
   <parentfolderid>68688162-ea1d-4974-9e4f-6af497d5cc2f</parentfolderid>
</folder>


Ich möchte per Schleife jeden "Subfolder" überprüfen.
Ich muss dies irgendwie in mit Regex machen das er mir jedesmal den Inhalt zwischen <folder> und </folder> zurück gibt. Und das ich dann jeden "<subfolder>inhalt</subfolder>" überprüfen kann.
Bei diesem Dateiinhalt würde die "Regex-Schleife" 3mal ausgeführt.

Kann mir vielleicht jemand zeigen wie das geht?
Ich würde es wohl hinbekommen wenn ich nur ein <folder> und </folder> hätte, aber ich weiß nicht wie ich mehrere Folder in eine Schleife bekomme.

Gruß,
Vreden123



Moderiert von user profile iconChristian S.: C#- durch XML-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 09.07.13 16:18 
Hallo,

und warum verwendest du keine XML-Klasse, z.B. XmlReader, XDocument, XmlDocument, ... oder Linq to XML?
Oder aber den XmlSerializer, s. z.B. Mit XmlSerializer Objekte als XML speichern und laden.
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Di 09.07.13 16:23 
Weil ich was "eigenes" machen wollte :-)

Das muss doch irgendwie mit Regex gehen oder?
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 09.07.13 19:53 
"Das muss doch gehen"
Nein. XML ist hinnreichend komplex, dass du es mit regexen nicht vollständig parsen kannst.
Ein bisschen parsen geht natürlich schon, aber das bringt's dann auch nicht so richtig...

Um deine Neugier zu stillen vielleicht noch so viel: Ein regex könnte z.B. so aussehen:
Zitat:
<folder>\s*(\s+<(\w+)>([^<]*)</\2>\s)+</folder>

Das Teil matcht dann immer direkt ein folder-Element und in den Gruppen müssten dann die Tags drin stehen. Aber whe jemand kommt auf die Idee, Attribute hinzuzufügen oder so... oder die Formatierung stimmt nicht. Oder ein Leerzeichen an der falschen Stelle. Ein CDATA Block. Ein leeres Tag.

Die ganzen Sachen, die deinen regex zu nichte machen, sollten dir aufzeigen dass es keine gute Idee ist :wink:
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 10.07.13 16:56 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Nein. XML ist hinnreichend komplex, dass du es mit regexen nicht vollständig parsen kannst.
Hm? .NET-Regexe können kontextfreie Sprachen erkennen, und das ist XML doch hoffentlich... ;) .



user profile iconvreden123 hat folgendes geschrieben Zum zitierten Posting springen:
Weil ich was "eigenes" machen wollte :-)
Wenn du das wirklich möchtest, wäre ein eigener Parser (z.B. durch Rekursiven Abstieg) wahrscheinlich lehrreicher als eine Regex-Bastellösung :) .

_________________
>λ=
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 10.07.13 22:15 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Hm? .NET-Regexe können kontextfreie Sprachen erkennen, und das ist XML doch hoffentlich... ;) .

Ach? :oops:
Als präventive Verteidigung darf ich voraus schicken, dass ich nicht Informatik studiere. Allerdings habe ich das eine oder andere interessiert aufgeschnappt ^^
Und da hieß es, dass HTML (bzw. XML) eben keine reguläre (sondern eine kontextfreie) Sprache ist... und ich bin jetzt mal davon ausgegangen, dass reguläre Ausdrücke nur reguläre Sprachen erfassen könne. (Und bin damit wohl nicht allein) Da du explizit .NET-Regexe ansprichst, dürfte das auch auf die allermeisten Regex-Engines zutreffen ...? Ich habe jetzt auf die schnelle auch keine Belege dafür gefunden, dass das eine oder andere stimmt.

Und selbst wenn .NET Regexe kontextfreie Sprachen erkennen können, wird das sicher weder schön noch schnell oder einfach sein XML korrekt zu parsen.
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Mi 10.07.13 23:26 
OK, dann werde ich doch nox eigenes Machen und eine XML-Klasse verwenden.
Aber welche kann ich am besten nehmen?

Also ich möchte z.B folgendes zu in einer bestehenden xml-Datei hinzufügen und nicht die ganze xml-Datei überschreiben, wie es momentan passiert :-)
Xml-Inhalt:
ausblenden XML-Daten
1:
2:
3:
4:
5:
<folder>
   <subfolder>/Ausbildungsnachweise/April/bla</subfolder>
   <folderid>ssc972bd-e78e-403a-9bf5-fc6be062144f</folderid>
   <parentfolderid>dd688162-ea1d-4974-9e4f-6af497d5cc2f</parentfolderid>
</folder>


Mit welcher klasse kann ich das am besten zu einer xml-Datei hinzufügen?

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 11.07.13 09:00 
Hallo vreden123,

wenn du wirklich eine reguläre XML-Datei hast, dann kann man nicht einfach unten Daten an die Datei dranhängen, denn der genormte Aufbau ist folgendermaßen:
ausblenden XML-Daten
1:
2:
3:
4:
<?xml version="1.0" encoding="UTF-8"?>
<RootTag>
  ...
</RootTag>

Es darf nur genau 1 RootTag geben (aber egal welchen Namen dieser Tag hat).
Und Daten (Zeilen) zu einer Datei an beliebiger Stelle hinzufügen, ist vom Dateisystem nicht vorgesehen.