2009-07-16 32 views
2

考慮到(標本 - 實際標記可能更復雜)標記和下面列出的約束,是否有人可以提出一種解決方案(C#)比步行更有效整棵樹檢索{「@@ value1 @@」,「@@ value2 @@」,「@@ value3 @@」},即在實際使用標記時將被替換的標記列表。從XML標記中提取選定節點值的方式

注意:我無法控制正在替換的標記的標記,結構或格式/命名。

<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

是否啓動序列化爲文字,或者已經被解析?簡單的正則表達式搜索,如果它已經序列化。 – p00ya 2009-07-16 09:35:03

+0

你只是想獲取令牌,或者需要替換它們? – amazedsaint 2009-07-16 09:42:39

+0

@amazedsaint - 只要他們=) – Rob 2009-07-16 09:55:12

回答

2

如何:

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); 
    } 

此:

  • 不打擾解析XML(只是字符串操作)
  • 只包括唯一值(無需返回MatchCollection與我們不想要的副本)

但是,它可以建立一個較大的字符串,那麼也許只是Matches

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

工作了一個款待(第二個片段),謝謝! =) – Rob 2009-07-16 09:54:41

0

我寫了一個快速編與您的示例,這應該做的伎倆。

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]; 
       } 
      } 
     } 
    }