我有一个类似 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/