使用正则表达式解析多个XML标记

时间:2011-11-13 07:40:42

标签: c# xml regex parsing

我需要从XML解析一些标签(它们的值)。这必须由正则表达式完成(不要问我为什么:))

例如:

 <name>AAA</name>
 <id>1234</id>
 <gender>M</gender>

我知道每个标签使用正则表达式所需的模式

string name =  "(?<=<name>).+?(?=</name>)";
string id = "(?<=<id>).+?(?=</id>)";
string gender = "(?<=<gender>).+?(?=</gender>)";

我只是不知道如何初始化Regex对象来处理所有这些对象。

我能做到:

private static readonly Regex rgx1 = new Regex(name);
private static readonly Regex rgx2 = new Regex(id);
private static readonly Regex rgx3r = new Regex(gender);

但我猜这是一种可怕的浪费......

所以我的问题是:如何初始化一个Regex来处理多种模式?

一旦我做了,如何从中提取值?

p.s:如果有人需要知道,我正在使用C#进行编程....

10x很多!

3 个答案:

答案 0 :(得分:3)

你不能指望那个在这个清单上回答问题的人接受“不要问我为什么”作为约束。在没有事先询问原因的情况下,任何自尊心的软件工程师都不会接受使用错误设计的要求。

答案 1 :(得分:2)

你说“不要问我为什么”,但我担心我会调用程序员的特权并问你为什么。如果不出意外,因为解决方案会根据实际问题而有所不同。因此,例如,即使使用正则表达式,如果你采用misha的例子(假设它被修复以正确处理元素之间的空白),它只能在完全你发布的XML上工作。

换句话说,使用这样的XML:

<name>AAA</name>
<id>1234</id>

比赛失败。

XML的目的是允许对这种数据进行通用处理。现在可以肯定的是,您可以修复正则表达式以确保它处理缺少的性别标记,但如果您的真实案例甚至比您的示例更复杂,那么您最终会得到一个非常复杂的正则表达式,并且确保其表现良好的责任将落在你身上。 (高质量的现代XML解析器经过高度优化以获得良好的性能。)

所以你有它:正确地回答你的问题,我们需要知道实际问题,在这种情况下,诸如“你必须使用正则表达式”这样的约束非常有趣。

比如说,所讨论的XML实际上并不是格式良好的XML,因此XML解析器将处于第一个障碍。了解这一点将使我们能够质疑问题是否可以分解为更简单的部分,例如首先提取格式良好的XML片段。

可能还有其他原因,但无论原因是什么,这对解决方案至关重要。请分享。

答案 2 :(得分:1)

更多通用解决方案,您甚至不必提前知道XML的标记:

static void Main(string[] args)
    {
        string path = @"C:\TestFile.xml";
        string input = File.ReadAllText(path);

        string pattern = @"<(.*)>(.*)</\1>";

        foreach (Match m in Regex.Matches(input, pattern))
        {
            System.Console.WriteLine(m.Groups[2].Value);
            System.Console.WriteLine("\n");
        }
    }

使用(m.Groups [1] .Value)获取XML标记的名称。