Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式解析多个XML标记_C#_Xml_Regex_Parsing - Fatal编程技术网

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

C# 使用正则表达式解析多个XML标记,c#,xml,regex,parsing,C#,Xml,Regex,Parsing,我需要从am XML解析几个标记(它们的值)。这必须由正则表达式完成(不要问我为什么:) 例如: <name>AAA</name> <id>1234</id> <gender>M</gender> 但我猜这是一种可怕的浪费 所以我的问题是:如何初始化一个Regex来处理多个模式 一旦我这样做了,如何从中提取值 p、 s:我在用C语言编程,如果有人需要知道 10倍多 您可以尝试以下方法: string input

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

例如:

 <name>AAA</name>
 <id>1234</id>
 <gender>M</gender>
但我猜这是一种可怕的浪费

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

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

p、 s:我在用C语言编程,如果有人需要知道

10倍多

您可以尝试以下方法:

  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"]);
字符串输入=@“AAA”
1234
M”;
字符串模式=@“(?。+)
(?.+)
(?.+)";
Match m=Regex.Match(输入,模式);
Console.WriteLine(m.Groups[“name”]);
控制台写入线(m.Groups[“id”]);
控制台。书写线(m.Groups[“性别]);
您可以尝试以下方法:

  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"]);
字符串输入=@“AAA”
1234
M”;
字符串模式=@“(?。+)
(?.+)
(?.+)";
Match m=Regex.Match(输入,模式);
Console.WriteLine(m.Groups[“name”]);
控制台写入线(m.Groups[“id”]);
控制台。书写线(m.Groups[“性别]);
你说“别问我为什么”,但我恐怕要援引程序员的特权问你为什么。如果没有其他问题,因为解决方案将根据实际问题的不同而有所不同。因此,例如,即使使用正则表达式,如果以misha为例(假设它已正确处理元素之间的空格),它也只能处理您发布的XML

换句话说,对于这样的XML:

<name>AAA</name>
<id>1234</id>
AAA
1234
比赛将失败

XML的目的是允许对此类数据进行通用处理。当然,您可以修复正则表达式以确保它处理丢失的性别标记,但是如果您的实际案例比您的示例更复杂,那么您最终将得到一个非常复杂的正则表达式,并且确保它良好运行的责任将落在您身上。(高质量的现代XML解析器经过了高度调优以获得良好的性能。)

好了,要正确回答您的问题,我们需要了解实际问题,在这种情况下,“您必须使用正则表达式”之类的约束非常有趣

例如,假设所讨论的XML实际上不是格式良好的XML,那么XML解析器将在第一个障碍中失败。了解了这一点,我们就可以质疑是否可以将问题分解为更简单的部分,例如首先提取格式良好的XML片段

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

你说“不要问我为什么”,但我恐怕我会援引程序员的特权问你为什么。如果没有其他问题,因为解决方案将根据实际问题的不同而有所不同。因此,例如,即使使用正则表达式,如果以misha为例(假设它已正确处理元素之间的空格),它也只能处理您发布的XML

换句话说,对于这样的XML:

<name>AAA</name>
<id>1234</id>
AAA
1234
比赛将失败

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");
        }
    }
static void Main(字符串[]args)
{
字符串路径=@“C:\TestFile.xml”;
字符串输入=File.ReadAllText(路径);
字符串模式=@“(.*)”;
foreach(在正则表达式中匹配m.Matches(输入,模式))
{
System.Console.WriteLine(m.Groups[2].Value);
System.Console.WriteLine(“\n”);
}
}

使用(m.Groups[1].Value)获取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");
        }
    }
static void Main(字符串[]args)
{
字符串路径=@“C:\TestFile.xml”;
字符串输入=File.ReadAllText(路径);
字符串模式=@“(.*)”;
foreach(在正则表达式中匹配m.Matches(输入,模式))
{
System.Console.WriteLine(m.Groups[2].Value);
System.Console.WriteLine(“\n”);
}
}

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

为什么不使用XML解析器呢?为什么不使用XML解析器呢