我有一个很大的 xml,其中包含许多记录作为子元素。有许多测试元素,每个
test
元素内部有许多 testchild
元素。大约有 200 个元素或 300 个或更多。由于这些元素的所有属性并非都来自 xml 文件,因此我需要手动解析 xml 元素并将其转换为对象列表。这需要很长时间(大约 46 秒),非常漫长。
如何提高性能?我正在使用
foreach
进行迭代。我也尝试过 linq,但花费的时间大约相同。我无法使用 AsParallel().All
,因为当某些元素尚未填充时它会崩溃。
你能帮助我提高表现吗?它是用 C# 编写的。
<root>
<test>
<testchild>
</testchild>
<testchild>
</testchild>
</test>
<test>
<testchild>
</testchild>
<testchild>
</testchild>
</test>
</root>
你能帮助我提高表现吗?它是用 C# 编写的。
没有代码?不。显示一些代码,我们可能有机会。
但是,
XmlSerializer
在这方面会比你做得更好。序列化从外面看起来很简单,但是存在很多的边缘情况和陷阱,在保持性能的同时避免这些是很难。
这是一个可运行的示例,可以满足您的基本模型,同时还支持评论中提到的未知属性/元素:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
var xml = """
<root>
<test>
<testchild>
</testchild>
<testchild>
</testchild>
</test>
<test>
<testchild id="42" name="fred">
</testchild>
<testchild>
</testchild>
</test>
</root>
""";
var serializer = new XmlSerializer(typeof(MyRoot));
var obj = (MyRoot)serializer.Deserialize(XmlReader.Create(new StringReader(xml)))!;
Console.WriteLine(obj.Tests.Sum(x => x.Children.Count));
Console.WriteLine(obj.Tests[1].Children[0].GetAttribute("id"));
[XmlRoot("root")]
public class MyRoot
{
[XmlElement("test")]
public List<MyTest> Tests { get; } = new();
}
public class MyTest
{
[XmlElement("testchild")]
public List<MyChild> Children { get; } = new();
}
public class MyChild {
public string? GetAttribute(string name)
=> attributes?.SingleOrDefault(x => x.Name == name)?.Value;
public string? GetElement(string name)
=> elements?.SingleOrDefault(x => x.Name == name)?.Value;
private List<XmlElement>? elements;
private List<XmlAttribute>? attributes;
[XmlAnyAttribute]
public List<XmlAttribute> Attributes => attributes ??= new();
[XmlAnyElement]
public List<XmlElement> Elements => elements ??= new();
}