如何提高xml解析性能

问题描述 投票:0回答:1

我有一个很大的 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# .net xml parsing foreach
1个回答
0
投票

你能帮助我提高表现吗?它是用 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(); }

	
© www.soinside.com 2019 - 2024. All rights reserved.