从 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 =&gt; (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 中获取每个元素的所有属性值的主要内容,如果未能解决你的问题,请参考以下文章

通过属性值访问 xml 元素

使用 Java 解析 XML 并获取元素值和属性值

如何获取每个节点的 href 元素和属性?

反射应用二(获取xml中键的属性及其值)

递归获取提升属性树中所有值的完整关键路径

java如何读取xml节点元素值?