c# - 在 C# 中使用 RegEx 在其他项出现后查找尖括号内的第一项

标签 c# .net xml regex

我有一个类似 xml 的文本,我想在其中查找第一次出现某个模式时出现的项目: 通常:

...
<PropertyGroup><name>true</name></PropertyGroup><PropertyGroup>....
....

也有可能

...
<PropertyGroup>
<name>
true</name>
</PropertyGroup>
...
<PropertyGroup>
...

在上面,我需要提取“名称”。

我最初的假设是所有出现的情况都在一行中,并且我使用字符串属性编写了代码,但是很难考虑到每种可能性,只有 RegEx 可以拯救我。

我就是不知道怎么写...

我从这样的事情开始:

Regex regex = new Regex("(?<=<PropertyGroup>#)<+");
Match matches = regex.Matches(Text)[0];
MessageBox.Show(matches.ToString());

我认为这会找到 <PropertyGroup> 之后的第一项,但我不知道如何让它获得尖括号内的项目...(可能在一个或多个换行符和/或空格之后)。

我知道有解析 xml 的实用程序,但我正在寻找一些简单的东西可以插入到 C# 程序中

有人可以帮我吗?非常感谢。

编辑: 实际文件内容(我现在正在测试的,没有奇怪的空格):

<?xml version="1.0" ?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
    <Import xxx/>   
  </ImportGroup>
  <PropertyGroup><myProp>true</myProp></PropertyGroup><PropertyGroup Label="UserMacros"/>
  <PropertyGroup/>
<!--maybe other stuff -->  
</Project>

最佳答案

使用 LINQ to XML 确实非常简单,并且比使用正则表达式可靠得多:

using System.Xml.Linq;

...

XElement xmlTree = XElement.Load(fileName);
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";

List<XElement> properties = (
    from propertyGroup in xmlTree.Descendants(ns + "PropertyGroup")
    from property in propertyGroup.Elements()
    select property
).ToList();

现在 properties 应该包含所有 PropertyGroup 元素的直接子级的所有 XElement 对象。您可以通过以下方式获取它们的名称和值:

foreach(var property in properties)
{
    string name = property.Name.LocalName;
    string value = property.Value;
    // process both strings   
}

这样您就不必担心任何类型的空格,并且它是一个非常可维护和可扩展的解决方案,可以继续从 XML 中检索其他信息。

另外,这确实是值得一读的东西,并且 here is the place to start 。这不会是您最后一次需要处理 XML 文件,如果您不必总是找出要解析的正则表达式(让我重复一遍,这通常是不可能的),您会很高兴。

关于c# - 在 C# 中使用 RegEx 在其他项出现后查找尖括号内的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336212/

相关文章:

c# - Windows 8.1 运行时 (C#) - 将 HttpResponseMessage 内容转换为 BitmapImage

c# - 使用 NHibernate Queryover 内部连接 ​​3 个表

.net - 如何在 winforms 应用程序中测试本地化?

c# - 根据 USPS 州缩写验证字符串

java - 读取 ASCII 编码的 XML 并保存为 UTF-8 时出现问题

c# - typescript 编译器可以生成 POCO .NET 类型/程序集吗?

c# - OpenCL 内核问题

.net - 说, "Assembly successfully added to the cache"但它不在缓存中

c# - StringWriter.ToString() 正在破坏 xml C#

android - BottomNavigationView:更改标题和图标之间的间隙大小