2013-07-18 209 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解析器的提示:)