gpt4 book ai didi

c# - 使用C#从XML检索文本

转载 作者:行者123 更新时间:2023-12-02 07:59:30 24 4
gpt4 key购买 nike

我有一个包含以下内容的文本文件:

<Person>
<Prenom>Jack</Prenom>
<Nom>Jhon</Nom>
<Adresse>4 rue de la Mélandine</Adresse>
<Tél></Tél>
<Email>email@gmail.com</Email>
<PhotoPath>c:\Program Files\Zonedetec\Gestionnaire de tâche v2\Img\5295f1ea-372a-4f2f-8f32-c52e8a48cc0839105.png</PhotoPath>
<Age>19</Age>
<Id>4640434</Id>
</Person>
<Person>
<Prenom>Jean</Prenom>
<Nom>Delamar</Nom>
<Adresse>13 rue de la Mélandine</Adresse>
<Tél></Tél>
<Email>email@gmail.com</Email>
<PhotoPath>c:\Program Files\Zonedetec\Gestionnaire de tâche v2\Img\5295f1ea-372a-4f2f-8f32-c52e8a48cc0839105.png</PhotoPath>
<Age>19</Age>
<Id>4640434</Id>
</Person>

我想检索标签之间的所有值
例如,在一个列表中,我想检索和之间的值(此处为2)

我该怎么办?

我尝试了这个:
internal static void LoadPerson()
{
string data = File.ReadAllText(Main.PersonnePath);

Regex regex = new Regex("<Person>(.*)</Person>");
var v = regex.Match(data);
string s = v.Groups[1].ToString();

MessageBox.Show(s);
}

除了s根本不包含任何东西

你能帮助我吗?
谢谢。

最佳答案

如果仅需要此值作为纯文本。您可以使用正则表达式或XMLSerializer或(Linq to XML)。

选择一种或另一种方法之前,需要分析的是:

1)我该怎么办?

1.a)如果您只需要每个标签内的纯文本。并且您将不执行任何验证/计算/重新解析器。您可以轻松地使用这两种方法。

1.a.1)使用正则表达式:

    public List<string> GetValueByRegex(string input)
{
string pattern = @"<Person>([\s\S]*?)</Person>";

var matches = Regex.Matches(input, pattern);

if (matches.All(m => !m.Success))
return null;

var result = new List<string>();
foreach (Match match in matches)
{
result.Add(match.Groups[1].Value);
}
return result;
}

1.a.2)使用XDocument解析Xml字符串

Important: XDocument requires that your XML have one root Tag to work. As Your XML has two root Tags. I forced it with string interpolation $"<root>{input}</root>"


    public List<string> GetValueByXmlParse(string input)
{
var result = new List<string>();
var ensureThereAreOnlyOneRootTag = $"<root>{input}</root>";

XDocument xmlDocument = XDocument.Parse(ensureThereAreOnlyOneRootTag);
foreach(var personXml in xmlDocument.Root.Elements("Person"))
{
result.Add(String.Concat(personXml.Nodes()));
}
return result;
}

1.b)如果您要对从XML提取的数据进行任何处理,最好将其解析为一个对象。

You can make Visual Studio generate one by copy the XML value and click in Edit > Paste Special > Paste XML As Classes.



@PavelAnikhouski已经分享了一个很好的例子。

2)我真的需要一个好的表现吗?

为了回答这个问题,我使用Benchmark nuget包来比较所有选项。结果如下:
|                Method |    Gen 0 | Allocated |
|---------------------- |---------:|----------:|
| GetValueByRegex | 1.2207 | 2688 B |
| GetValueByXmlParse | 115.6006 | 243536 B |

Gen 0 : GC Generation 0 collects per 1000 operations

Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B)



因此,答案是:取决于您需要如何处理结果。希望我能帮助您做出决定。

最好的祝福

关于c# - 使用C#从XML检索文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59335342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com