2

我有一个类似 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());

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

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

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

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

<?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>
4

3 回答 3

2

使用 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应该包含所有元素XElement的直接子PropertyGroup元素的所有对象。您可以通过以下方式获取它们的名称和值:

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

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

另外,这确实是值得一读的东西,这里是开始的地方。这不会是您最后一次需要处理 XML 文件,如果您不必总是想出一个正则表达式来解析,您会很高兴(让我再说一遍,这甚至通常是不可能的)。

于 2012-11-11T23:08:47.007 回答
1

“我知道有用于解析 xml 的实用程序” 不,与其说是内置于 .net 框架中的类,不如说是实用程序。

建议你阅读XmlDocument

于 2012-11-11T22:58:22.890 回答
1

尝试这个:

(?s)<PropertyGroup>\s+<([^>]+)

例子:

var result = 
    Regex.Match(input, @"(?s)<PropertyGroup>\s+<([^>]+)")
    .Groups[1].Value;
于 2012-11-11T22:42:33.637 回答