【问题标题】:How can I get all the values individually in an xml file using Linq to xml in c#如何在 c# 中使用 Linq to xml 在 xml 文件中单独获取所有值
【发布时间】:2017-10-25 04:20:41
【问题描述】:

例如,如果我有这样的嵌套 xml

<Root>
  <NodeA>
    <NodeA1>
      <NodeA11>
        <SameNameNode>
          <SameNameNodeChild1>Value 1</SameNameNodeChild1>
          <SameNameNodeChild2>Value 2</SameNameNodeChild2>
        </SameNameNode>
      </NodeA11>
    </NodeA1>
  </NodeA>
  <NodeB>
    <SameNameNode>
      <SameNameNodeChild1>Value 3</SameNameNodeChild1>
      <SameNameNodeChild2>Value 4</SameNameNodeChild2>
    </SameNameNode>
  </NodeB>
  <NodeC>
    <NodeC1>
      <SameNameNode>
        <SameNameNodeChild1>Value 5</SameNameNodeChild1>
        <SameNameNodeChild2>Value 6</SameNameNodeChild2>
      </SameNameNode>
    </NodeC1>
  </NodeC>

如何检索所有值 值 1 一直到值 6 并将它们存储在 Excel 表中?

目前我的代码是

  foreach (XElement DirectChild in xml.Descendants())
            {
                foreach (XElement child in DirectChild.Descendants())
                {

                    foreach (XElement GrandChild in DirectChild.Elements())
                    {

                    dataList.Add(GrandChild.Value);

                    }

            }

并将数据放入 Excel 工作表中。

虽然我得到的数据格式是这样的

在 1 个单元格中 {值 1 值 2}

在第二个单元格 {value 1}

在第 3 个单元格 {value 2}

在单元格 4 {值 3 值 4}

单元格 5 {值 3}

单元格 6 {值 4}

有什么方法可以单独动态获取每个值而不需要分组获取值,我有大约 100 个 xml 文件要转换,我认为我不能专门标记它

有什么想法吗?

【问题讨论】:

  • 预期结果是单元格 1:值 1;单元格 2:值 2;单元格 3:值 3;等等等等
  • 您能否更具体地说明为什么单元格需要数据?样本输入并不总是具有相同数量的元素。您还需要元素名称吗?我看起来您正在尝试对 100 个文件中的数据进行分组,但不确定分组的要求是什么。
  • 对不起,我为每个元素 grp 放置的输入是错误的,在这种情况下,数据将在 1 个单元格内,值 1 和 2 将在一个单元格中 grp 4 次,然后将它们分别分成 1 个单元格。我不知道分组的要求唯一的任务是每个值都在自己的单元格中
  • 你必须计划这个任务。开始查看多个文件以确定如何将数据放入工作表中,以免数据重叠。上大学时,老师布置了一项任务,从文件中读取学生数据。第一个文件没有错误。 .第二个文件有错误。当我完成时,我有超过 500 张打孔卡让程序在批处理系统上运行,需要 4 个小时才能打印出来。圆形篮子里有1000多张打孔卡。现在只需几分钟,无需打卡。但是您不想对程序进行更改。先做设计。

标签: c# xml excel linq-to-xml


【解决方案1】:

编辑:过滤没有子元素的元素的示例

XElement root = XElement.Parse(@"<Root>
  <NodeA>value</NodeA>
  <NodeB>value</NodeB>
  <NodeC>
    <NodeD>value</NodeD>
  </NodeC>
  </Root>
  ");

foreach(var el in root.Descendants())
{
    if(!el.HasElements)
        Console.WriteLine(el.ToString());
}

【讨论】:

  • 正如我所说的那样,无论如何都可以在不写下标签名称的情况下做事,因为一百个 xml 文件可能有不同的标签名称,这会使做特定标签的事情变得更加困难。感谢您的快速回复
  • 对不起,我没有正确阅读。如果您知道具有文本值的元素不会嵌套其他元素,那么您可以使用它作为测试来过滤元素。有关示例,请参见编辑后的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多