Laden...

Alle Wörter aus einer XML-Datei lesen

Erstellt von zedream vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.985 Views
Z
zedream Themenstarter:in
2 Beiträge seit 2011
vor 12 Jahren
Alle Wörter aus einer XML-Datei lesen

Hi Hi,
ich schreibe ein kleines C#-Programm, das eine xml-Datei liest and alle Wörter zwischen 2 klammern ausgibt. Allerdings wird nur das erste Wort in Klammern ausgegeben.
Bitte um Hilfe!

C#-Programm:

static string ReadInnerText()
        {
            using (var fs = new FileInfo(@"C:\....\XML.xml").OpenText())
            {
                string text = fs.ReadToEnd();
                string ba = @".*\((?<inner>.*)\).*";
                Match match = Regex.Match(text, ba);
             
                return match.Groups["inner"].Value;
            }
               
            }
6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

wenn du XML hast, dann benutz auch eine der gängigen Methoden um XML zu verarbeiten wie Linq to XML (XDocument) bzw. das klassische XML DOM XMLDocument. Mit regulären Ausdrücken zu arbeiten ist alles andere als zielführend.

Baka wa shinanakya naoranai.

Mein XING Profil.

L
27 Beiträge seit 2011
vor 12 Jahren

Hallo,
der Regex "konsumiert" den kompletten string.
Außerdem mußt du die matches in einer Schleife abfragen.

Hier ein funktionierender Vorschlag:

string text = @"asdrer(erer)fasdf<abc>asd(urer)fasdf<ts>adf</ts></abc>";
string ba = @"\((?<inner>[^\)]*)\)";
Match match = Regex.Match(text, ba);
foreach (Match __match in Regex.Matches(text, ba))
{
  var __res = __match.Groups["inner"].Value;
}

Noch eine Frage von mir. Wenn ich in der Foreach-Schleife schreibe:
foreach (var __match in Regex.Matches(text, ba))
wird aus der MatchCollection ein Object für var als Typ gesetzt.
Warum diese "Schwäche" bei MatchCollection? Ist das kein IEnumerable? Wieso läuft dann foreach trotzdem so:

foreach (var __match in Regex.Matches(text, ba))
{
  var __res = ((Match)__match).Groups["inner"].Value;
}

??

Hinweis von gfoidl vor 12 Jahren

Dazu reicht ein Blick in die Doku (od. jetzt dem Link von xxxprod folgen).
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.

1.378 Beiträge seit 2006
vor 12 Jahren

Weil MatchCollection nur IEnumerable und nicht IEnumerable<Match> implementiert.

Lg, XXX

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo zedream,

nicht dass tallas Antwort untergeht, denn das ist bei XML der einzig vernüftige Weg: mit den speziell für die XML-Verarbeitung erstellten Techniken sollte auch XML verarbeitet werden. Am einfachsten gehts mit Linq to XML in Form von XDocument und XElement.

Regex ist ein mächtiges Werkzeug für die String-Verarbeitung, aber für XML gibts halt einfacheres/besseres.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
27 Beiträge seit 2011
vor 12 Jahren

ah! Danke.
Die Typisierung bei IEnumerable ist mir nicht klar.
Ich werde mal var auch mit diesem Link versuchen zu verstehen:
Typbeziehungen in LINQ-Abfragevorgängen (C#)

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Ludus,

Die Typisierung bei IEnumerable ist mir nicht klar.

IEnumerable ist einfach untypsisiert.

Aber das soll hier nicht das Thema sein, zumal es unter [Hinweis] Wie poste ich richtig? Punkt 1.1, 1.1.1, 1.2 fällt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"