none
bestimmte Zeile aus String filtern RRS feed

  • Frage

  • Hallo,

    ich suche eine Lösung um in einem String nach einem bestimmten Wort zu filtern und dieses in einem anderen String zu speichern. Der String sieht folgendermaßen aus:

    <td width="75"><a class="RichTextIntLink Basepage" href="DE/Themen/ITGrundschutz/ITGrundschutzKataloge/Inhalt/_content/m/m02/m02337.html;jsessionid=F1D4635558C48F1D94E1F8A9BABA3FC6.2_cid294" title="M 2.337 Integration der Informationssicherheit in organisationsweite Abläufe und Prozesse">M 2.337</a></td>

    Nun möchte ich genau das was zwischen

    title = "________________"> (also M 2.337 Integration der Informationssicherheit in organisationsweite Abläufe und Prozesse) in einem anderen String speichern!

    Weiß jemand wie ich sowas bewerkstellige? Wäre euch sehr dankbar wenn mir jemand einen Lösungsansatz bieten könnte.

    Danke und Gruß

    Montag, 22. September 2014 13:14

Antworten

Alle Antworten

  • Hi,
    um die erste in Gänsefüßchen eingeschlossen Zeichenkette zu finden, kann der folgende Code genutzt werden:

    Using System.Text.RegularExpressions;
    
    ...
    
    string inp = ....;
    string out = Regex.Match(inp, "[^""][^""]+").ToString();
    
    ...

    Vorher kannst Du auf die Stelle positionieren, ab welcher Du extrahieren willst.

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Montag, 22. September 2014 13:29
  • Hallo,
    dein String sieht sehr nach HTML aus. Du könntest den String mit dem HtmlAgilityPack parsen und dann einfach das title-Attribut abfragen:
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(s);
    var n = doc.DocumentNode.Descendants("a").First().Attributes["title"].Value;
    Wenn dein String dagegen immer gültiges XML ist, kannst du auch LINQ to XML verwenden
    var doc = XDocument.Parse(s);
    var n = doc.Descendants("a").First().Attribute("title").Value;
    PS: Diese Lösung ist auch unempfinagegen, falsich die Reihenfolger Attribute ändern sollte.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 22. September 2014 14:25
    Moderator
  • Guten Morgen,

    ich habe die Lösung von Koopakiller mal versucht und das funktioniert ganz gut. Leider kapier aber nicht ganz was da von Statten geht. Ich möchte nun nämlich im zweiten Schritt den Ausschnitt "m02337.html" aus dem String in einen anderen speichern.

    Kannst du mir anhand dieses zweiten Beispiels das mit dem HtmlAgilityPack zeigen damit ich die Methode kapiere!?

    Danke und Gruß

    Dienstag, 23. September 2014 05:44
  • Ich denke das Du bei den beschriebenen Anforderungen besser den Regular Expressions Ansatz verfolgst. Es geht hier ja offensichtlich nicht nur darum ein HTML-Attribut zu ermitteln. Ich empfehle auf jedenfall dich mit dem Thema "Parsing" auseinanderzusetzen, ich denke Du wirst das noch öfters brauchen und die Einzellösung hilft nicht unbedingt dem Verständnis. Regular Expressions sind für das parsen jedenfalls sehr hilfreich und ein Lohnenswertes Thema.

    - Florian

    Dienstag, 23. September 2014 13:03
  • Hallo,
    mithilfe der LoadHtml-Methode habe ich den String als HTML Code in das HtmlDocument geparsed. Im Speicher liegen dadurch nun die einzelnen Knoten des HTMLs.
    Der DocumentNode stellt dann den obersten Knoten dar, bei HTML eigentlich <html>, bei dir aber <td>. Mit Hifle von Descendants kann man alle Knoten aus verschiedenen Ebenen herausfiltern, die einen bestimmten Typ haben. Mit der First-Methode wähle ich das erste Suchergebnis aus und Frage mit Hilfe der Attributes-Auflistung das Attribut ab. Die Value-Eigenschaft repräsentiert dann den eigentlichen Inhalt.

    Ich kenne nicht deine gesamten Vorraussetzungen, wenn es sich allerdings wirklich um HTML handelt, würde ich das AgilityPack dem manuellen Parsen vorziehen.

    Auch sehe ich bei deinem Vorhaben noch nichtmal einen Grund das meistens langsame Regex einzusetzen. Damit geht es zwar relativ einfach, wenn man aber drüber nachdenkt geht es mit den klassischen Methoden genauso schön.

    var aIndex = s.IndexOf("<a");//Index-Vom a-Tag
    var titleIndex = s.IndexOf("title=\"", aIndex);//Index von title-Attribut hinter dem a-Tag
    var content = s.Substring(titleIndex + 7, s.IndexOf("\"", titleIndex + 7) - titleIndex - 7);

    Das m02337.html ist Teil des href-Attributs des Links. Du müsstest hier also zunächst den Wert dieses Attributs bestimmen. Hier 2 Lösungen dafür:

    //Auslesen mit HtmlDocument (Den a-Tag solltest du für mehrere Zugriffe in einer Variablen zwischen speichenr um Leistung zu sparen)
    var href1 = doc.DocumentNode.Descendants("a").First().Attributes["href"].Value;
    
    //Auslesen mit Hifle der String-Methoden
    var hrefIndex = s.IndexOf("href=\"", s.IndexOf("<a"));
    var href2 = s.Substring(hrefIndex + 6, s.IndexOf("\"", hrefIndex + 6) - hrefIndex - 6);
    Im nächsten Schritt musst du nun den Dateinamen aus der URL heraus hohlen.
    Dabei kannst du dir die Path-Klasse zu Hilfe nehmen oder es komplett manuell machen. Eine mögliche Lösung:
    var fileName1 = Path.GetFileName(href.Remove(href.LastIndexOf(";jsessionid")));

    Viel hängt an dem parsen nicht drann. Man muss nur wissen welche Methoden es gibt und wie man sie einsetzt um den String an den richtigen Stellen zu teilen. Die MSDN verfügt über eine Liste aller verfügbaren Methoden und überladungen: String-Methoden


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 23. September 2014 14:16
    Moderator