2013-07-18 245 views
0

我有一個字符串格式化這種方式(分裂和檢索參數):字符串解析

<?TAG param1="val1" parm2="val2" paramN="valN" /><?TAG param1="val1" parm2="val2" paramN="valN"/><?TAG param1="val1" parm2="val2" paramN="valN"/> 

「TAG」始終是相同的值,但出現次數爲變量和參數每次出現人數太多。我無法更改源格式。

我需要獲取使用C#(.NET 4.0)每個事件的參數列表你能幫我嗎?

+0

您是否嘗試過任何操作?你可以發佈你的當前代碼並解釋你被卡住的地方嗎? – Oded

+0

你能舉一個你正在尋找的輸出的例子嗎? –

+0

你的開放元素是否真的有一個問號('?'),否則它看起來非常接近Xml。 – Romoku

回答

3
XElement rootElement = XElement.Parse(string.Format("<element>{0}</element>", 
              yourString.Replace("?TAG", "TAG"))); 
var elements = rootElement.Elements(); 
var yourResult = elements.Select(x => new TagsAndParams { Tag = x, 
    Params = x.Attributes.Where(xa => xa.Name.LocalName.BeginsWith("param") }); 

有了這個類,結果持有人(我知道我可以使用匿名類型,但是這是更好地傳遞到其他功能):

public class TagsAndParams 
{ 
    XElement Tag; 
    IEnumerable<XAttribute> Params; 
} 
0

你可以用一個討厭的RegEx做到這一點,但我會確保它並不是一個真正的XML PI鏈第一:

(?<tag><?TAG (?<parm>param\d{1,2}=\"[^\"]+\"\s*)*\/\>)* 

這將匹配組,其中包含每個組:

  • 完整標籤
  • paramX = 「valX」 對
+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

@newStackExchangeInstance愚蠢的機器人,這既不是XHTML,也不是HTML,也不是真的XML ... – JerKimball

+0

I知道它不是[X] HTML。但是這**是** XML(除了這些''')。 –

0
using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

class ExampleClass 
{ 
    static void Main(string[] args) 
    { 
     string example = "<?TAG param1=\"val1\" param2=\"val2\" paramN=\"valN\" /><?TAG param1=\"val1\" param2=\"val2\" paramN=\"valN\"/><?TAG param1=\"val1\" param2=\"val2\" paramN=\"valN\"/>"; 
    List<Dictionary<string, string>> result = new List<Dictionary<string, string>>(); 
     string[] tokens = Regex.Split(example, "/><\\?TAG|<\\?TAG|/>"); 
     foreach (string token in tokens) if (token.Length > 0) 
     { 
      Dictionary<string, string> parameters = new Dictionary<string, string>(); 
      string[] parms = token.Split(' '); 
      foreach (string parm in parms) if (parm.Length > 0) 
      { 
       string[] keyvalue = Regex.Split(parm, "=\"|\""); 
       parameters.Add(keyvalue[0], keyvalue[1]); 
      } 
      result.Add(parameters); 
     } 

    Console.WriteLine("TAGs detected: " + result.Count); 
    foreach (Dictionary<string, string> token in result) 
     { 
      Console.WriteLine("TAG"); 
      foreach (KeyValuePair<string, string> kvp in token) 
       Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); 
     } 
    } 
} 

我已經使用這個代碼終於解決了(提供由我的一個朋友)。訣竅是用於分割單個元素的正則表達式。感謝您的支持,我將在未來使用關於xml解析器的提示:)