从 XML 中获取每个元素的所有属性值
Posted
技术标签:
【中文标题】从 XML 中获取每个元素的所有属性值【英文标题】:Get all value of attribute from each Element from XML 【发布时间】:2021-08-26 08:29:57 【问题描述】:我有一个如下所示的 xml 文件:
<HeadercardUnit EndTime="2065-25-45 20:32:44" StartTime="2065-25-45 20:32:23" Rejects="NO" MilliSec="1" Currency="USD" DeclaredDepositAmount="0" denomvalue="1" DepositID="" CustomerID="" HeaderCardID="">
<Counter Number="2" Currency="USD" Output="Stacked" Quality="Accepted" Issue="2006" Value="5" DenomID="" DenomName="5 USD-2006"/>
<Counter Number="31" Currency="USD" Output="Stacked" Quality="Accepted" Issue="2000" Value="1" DenomID="" DenomName="1 USD-2000"/>
<Sum Number="33" Currency="USD" Output="Stacked" Sum="41.00"/>
</HeadercardUnit>
我尝试用这段代码解析它:
string[] content = Directory.GetFiles(Directory.GetCurrentDirectory() + @"\", "*.xml");
XDocument xdoc = XDocument.Load(content[0]);
XElement xml1 = XElement.Load(content[0]);
string xml2 = xml1.ToString();
//Console.WriteLine(xml2);
XElement xml = XElement.Parse(xml2);
var counter = xdoc.Descendants("Counter").Count();
var data = from bps in xdoc.Root.Descendants("Machine")
let Param = bps.Element("ParameterSection")
let Opt = Param?.Element("Operator")
let Hcl = Param?.Element("HeadercardUnit")
let Count = Hcl?.Element("Counter")
select new
Type = (string)bps.Attribute("Type"),
SerialNum = (string)bps.Attribute("SerialNumber"),
Startime = (string)Param?.Attribute("StartTime"),
Endtime = (string)Param?.Attribute("EndTime"),
Opt = (string)Opt?.Value,
Number = (string)Count?.Attribute("Number")
;
foreach (var pcl in data)
MessageBox.Show(counter.ToString());
for (int i = 0; i < counter; i++)
LogService(string.Format("0,1,2,3,4,5",
pcl.Type, pcl.SerialNum, pcl.Startime, pcl.Endtime, pcl.Opt, pcl.Number));
结果只给了我一行循环两次,因为计数器标签有两个元素如下所示:
BPSC1,309322,2065-25-45 20:32:23,2065-25-45 20:32:44,User1,2
BPSC1,309322,2065-25-45 20:32:23,2065-25-45 20:32:44,User1,2
【问题讨论】:
那么,您的问题是什么?你卡在哪里了?你想达到什么目标? @Peter Csala 我希望结果中的第二行来自包含 31 的 xml 上的第二个计数器标签 如果你想忽略第一个元素,你可以调用xdoc.Descendants("Counter").Skip(1)
。或者,如果您明确想要获得Counter
,它的Number
为31,那么xdoc.Descendants("Counter").FirstOrDefault(element => (string)element.Attribute("Number") == "31")
【参考方案1】:
鉴于您省略了部分 XML 以使其能够被复制,因此很难给出明确的答案。但是,这一行:
let Count = Hcl?.Element("Counter")
获取 first Counter
元素。如果您想要所有这些(如您所建议的),那么您需要遍历这些:
from Count in Hcl.Elements("Counter")
这将在data
中为每个Counter
元素创建一个对象。
【讨论】:
【参考方案2】:我添加了受@Charles Mager 启发的行
from bps in xdoc.Root.Descendants("Machine")
from Countx in bps.Descendants("Counter")
然后我可以调用所有属性
【讨论】:
以上是关于从 XML 中获取每个元素的所有属性值的主要内容,如果未能解决你的问题,请参考以下文章