gpt4 book ai didi

c# - 选择一些特定的 xml 元素来列出匿名对象

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:38 24 4
gpt4 key购买 nike

我有一个包含主要 XElement“细节”和几个“细节”XElements 的 xml 文档,对于每个细节元素,我还有几个“节点”元素,这是我的 xml 文档的一部分:

<details>
<detail>
<node>
<key>HEADER ID</key>
<value>D10</value>
</node>
<node>
<key>PRODUCT NO</key>
<value>9671834480D04 </value>
</node>
<node>
<key>WIRE (CODE)</key>
<value>AD8</value>
</node>
<node>
<key>WIRE SIZE(CODE)</key>
<value>047</value>
</node>
<node>
<key>WIRE COLOR(CODE)</key>
<value>30</value>
</node>
<node>
<key>CUT LENGTH</key>
<value>01910</value>
</node>
</detail>
<detail>
<node>
...
</node>
...
</detail>
...
<details>

我正在尝试将此 xml 部分转换为对象列表,其中仅包含 3 个对应于“键”和“值”元素的属性。例如,对于细节中的每个细节元素和细节中的每个节点元素,我只想获得关键元素等于“产品编号”或“线种(代码)”或“切割长度”的 3 个节点?

这是我的代码,它可以工作,但我认为它不适合性能:

var champs = 
from detail in details
let productNo = detail.Elements("node")
.Where(k => k.Element("key")
.Value == "PRODUCT NO")
.Select(v => v.Element("value").Value)
.First()
let wireCode = detail.Elements("node")
.Where(k => k.Element("key").Value == "WIRE (CODE)")
.Select(v => v.Element("value").Value)
.First()
let cutLength = detail.Elements("node")
.Where(k => k.Element("key").Value == "CUT LENGTH")
.Select(v => v.Element("value").Value)
.First()
select new { ProductNo = productNo, WireCode = wireCode , CutLength = cutLength };

我认为这是一个 select n+1 问题的例子,因为对于每个属性我必须浏览所有节点,我怎样才能用一个循环做同样的事情?

最佳答案

我实际上会在性能之前考虑可读性,除非你知道你有性能问题。但即便如此,您绝对可以改进代码。我会考虑使用 ToDictionary转换每个 detail元素变成 Dictionary<string, string> ,然后你就可以得到你想要的位:

var query = details.Select(d => d.Elements("node")
.ToDictionary(n => n.Element("key").Value,
n => n.Element("value").Value))
.Select(x => new { ProductNo = x["PRODUCT NO"],
WireCode = x["WIRE (CODE)"],
CutLength = x["CUT LENGTH"] });

然后非常可以根据需要添加额外的属性。

关于c# - 选择一些特定的 xml 元素来列出匿名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488321/

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