使用regex解析多个XML标记
本文关键字:XML 标记 regex 使用 | 更新日期: 2023-09-27 18:14:16
我需要从XML中解析一些标记(它们的值)。这必须通过regex完成(不要问我为什么:))
例如: <name>AAA</name>
<id>1234</id>
<gender>M</gender>
我知道使用regex
每个标签所需的模式string name = "(?<=<name>).+?(?=</name>)";
string id = "(?<=<id>).+?(?=</id>)";
string gender = "(?<=<gender>).+?(?=</gender>)";
我只是不知道如何初始化Regex
对象来处理所有这些。
I can do:
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#编程,如果有人需要知道....
你可以试试:
string input = @" <name>AAA</name>
<id>1234</id>
<gender>M</gender>";
string pattern = @"<name>(?<name>.+)</name>
<id>(?<id>.+)</id>
<gender>(?<gender>.+)</gender>";
Match m = Regex.Match(input, pattern);
Console.WriteLine(m.Groups["name"]);
Console.WriteLine(m.Groups["id"]);
Console.WriteLine(m.Groups["gender"]);
你说"不要问我为什么",但我恐怕要调用程序员的特权来问你为什么。如果没有别的,因为解决方案将根据实际问题而变化。因此,例如,即使使用正则表达式,如果您以misha的示例为例(假设它被固定为正确处理元素之间的空白),它将只对完全您发布的XML起作用。
换句话说,对于这样的XML:
<name>AAA</name>
<id>1234</id>
匹配将失败。
XML的目的是允许对这类数据进行通用处理。当然,您可以修改正则表达式,以确保它能够处理缺失的性别标签,但是如果实际情况比示例稍微复杂一点,那么您最终得到的将是一个非常复杂的正则表达式,而确保它良好运行的责任将落在您的身上。(高质量的现代XML解析器经过高度调优,以获得良好的性能。)
所以你有它:要正确回答你的问题,我们需要知道实际的问题,在这种情况下,一个约束,如"你必须使用正则表达式"是相当有趣的。
例如,所讨论的XML实际上不是格式良好的XML,因此XML解析器在第一个障碍中就会失败。知道了这一点,我们就可以考虑是否可以将问题分解成更简单的部分,比如首先提取一个格式良好的XML片段。
可能有其他原因,但无论原因是什么,它对解决方案至关重要。请分享。
你不能指望回答这类问题的人接受"不要问我为什么"作为约束。没有一个有自尊的软件工程师会在没有问清楚原因的情况下接受使用错误设计的要求。
一个更通用的解决方案你甚至不需要事先知道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.s groups [1]. value)获取XML标签的名称