我有一个基本上是XML节点的字符串,我需要提取属性的值。我正在尝试使用以下C#代码来实现此目的:
string line = "<log description="Reset Controls - MFB - SkipSegment = True" start="09/13/2011 10:29:58" end="09/13/2011 10:29:58" timeMS="0" serviceCalls="0">"
string pattern = "\"[\\w ]*\"";
Regex r = new Regex(pattern);
foreach (Match m in Regex.Matches(line, pattern))
{
MessageBox.Show(m.Value.Substring(1, m.Value.Length - 2));
}
问题是,这只会返回字符串中的最后一次出现(上例中为“0”),此时每个字符串包含5次出现。如何使用C#获取每次事件?
答案 0 :(得分:6)
不要尝试使用正则表达式解析XML。请改用XML API。试图破解“足够的XML解析器”只是一个非常糟糕的想法 - 你最终会得到令人难以置信的脆弱代码。
现在你的行实际上实际上是一个有效的XML元素 - 但是如果你添加一个</log>
它将是。
XElement element = XElement.Parse(line + "</log>");
foreach (XAttribute attribute in element.Attributes())
{
Console.WriteLine("{0} = {1}", attribute.Name, attribute.Value);
}
那是稍微 hacky,但它比自己伪造XML解析更好。
答案 1 :(得分:1)
顺便说一句,你需要为双引号转义字符串并添加一个分号:
string line = "<log description=\"Reset Controls - MFB - SkipSegment = True\" start=\"09/13/2011 10:29:58\" end=\"09/13/2011 10:29:58\" timeMS=\"0\" serviceCalls=\"0\">";
答案 2 :(得分:1)
要真实回答您的问题,您的pattern
应该是"\"[^\"]*\""
,因为\w
与空格,符号等不匹配。