我有一个以这种方式格式化的字符串:
<?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 :(得分: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;
}
答案 1 :(得分:0)
你可以用一个讨厌的RegEx
做到这一点,但我确保它实际上不是一个XML PI链:
(?<tag><?TAG (?<parm>param\d{1,2}=\"[^\"]+\"\s*)*\/\>)*
这将匹配组,每组包含:
答案 2 :(得分: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解析器的提示:)