2009-07-16 10 views
2

Angesichts der (im Folgenden unter Umständen wesentlich komplizierteren) Markup- und Constraints kann jemand eine Lösung (C#) vorschlagen, die effektiver/effizienter ist als das Gehen gesamter Baum, der abgerufen werden soll {"@@ value1 @@", "@@ value2 @@", "@@ value3 @@"}, dh eine Liste von Token, die ersetzt werden, wenn das Markup tatsächlich verwendet wird.Weg (e) zum Extrahieren ausgewählter Knotenwerte aus diesem XML-Markup

Hinweis: Ich habe keine Kontrolle über die Markup, Struktur der Markup oder Format/Benennung der Token, die ersetzt werden.

<markup> 
    <element1 attributea="blah">@@[email protected]@</element1> 
    <element2>@@[email protected]@</element2> 
    <element3> 
     <element3point1>@@[email protected]@</element3point1> 
     <element3point2>@@[email protected]@</element3point2> 
     <element3point3>apple</element3point3> 
    <element3> 
    <element4>pear</element4> 
</markup> 
+0

Ist es serialisiert als Text beginnen oder bereits analysiert in? Einfache Suche nach regulärem Ausdruck, wenn sie bereits serialisiert ist. – p00ya

+0

Sie möchten nur Tokens abrufen oder müssen sie ersetzen? – amazedsaint

+0

@amazedsaint - holen Sie sie einfach =) – Rob

Antwort

2

Wie wäre:

var keys = new HashSet<string>(); 
    Regex.Replace(input, "@@[^@][email protected]@", match => { 
     keys.Add(match.Value); 
     return ""; // doesn't matter 
    }); 
    foreach (string key in keys) { 
     Console.WriteLine(key); 
    } 

Dieses:

  • nicht stört das Parsen von XML (nur String-Manipulation)
  • nur enthält die einzigartige Werte (keine Notwendigkeit, eine MatchCollection mit den Duplikaten zurückgeben, die wir nicht wollen)

Es kann jedoch eine größere Zeichenfolge, bauen so vielleicht Matches gerade:

var matches = Regex.Matches(input, "@@[^@][email protected]@"); 
var result = matches.Cast<Match>().Select(m => m.Value).Distinct(); 
foreach (string s in result) { 
    Console.WriteLine(s); 
} 
+0

Arbeitete ein Leckerbissen (zweites Schnipsel), danke! =) – Rob

0

Ich schrieb eine schnelle prog mit Ihrer Probe, das den Trick tun soll.

class Program 
    { 
     //I just copied your stuff to Test.xml 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load("Test.xml"); 
      var verbs=new Dictionary<string,string>(); 
      //Add the values to replace ehre 
      verbs.Add("@@[email protected]@", "mango"); 
      verbs.Add("@@[email protected]@", "potato"); 
      ReplaceStuff(verbs, doc.Root.Elements()); 
      doc.Save("Test2.xml"); 
     } 

     //A simple replace class 
     static void ReplaceStuff(Dictionary<string,string> verbs,IEnumerable<XElement> elements) 
     { 
      foreach (var e in elements) 
      { 
       if (e.Elements().Count() > 0) 
        ReplaceStuff(verbs, e.Elements()); 
       else 
       { 
        if (verbs.ContainsKey(e.Value.Trim())) 
         e.Value = verbs[e.Value]; 
       } 
      } 
     } 
    } 
Verwandte Themen