Entwickler-Ecke

Basistechnologien - [c#] regex problem


vreden123 - Di 09.07.13 14:31
Titel: [c#] regex problem
Hallo ich habe eine Textdatei mit folgendem Inhalt:

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 - Di 09.07.13 16:18

Hallo,

und warum verwendest du keine XML-Klasse, z.B. XmlReader, XDocument, XmlDocument, ... oder Linq to XML [http://msdn.microsoft.com/de-de/library/vstudio/bb387098.aspx]?
Oder aber den XmlSerializer, s. z.B. Mit XmlSerializer Objekte als XML speichern und laden [http://www.entwickler-ecke.de/topic_Mit+XmlSerializer+Objekte+als+XML+speichern+und+laden_64947.html].


vreden123 - Di 09.07.13 16:23

Weil ich was "eigenes" machen wollte :-)

Das muss doch irgendwie mit Regex gehen oder?


jfheins - 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 - 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 - 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 [http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html]) 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 - 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:

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 - 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:

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.