【问题标题】:C# XML Query Attributes from specific parent node and add them to childrenC# XML 查询来自特定父节点的属性并将它们添加到子节点
【发布时间】:2017-11-08 13:38:36
【问题描述】:

所以我有一个具有以下结构的 xml 文件:

 <Group Name = "Groceries">
 <Lifetime Creation="2015" Expiration="2018" />
   <Brown Vegetables>
      <Potatoes>
     <LifeTime Creation ="0" Expiration ="0"/>
       </Potatoes>
   </Brown Vegetables>
  <Green Vegetables>
            <Lettuce>
     <LifeTime Creation ="1" Expiration ="1"/>
       </Lettuce>
  <Green Vegetables>
   </Group>

所以 Group Name 被认为是父杂货。 我想从包含名称“杂货”的组名中获取 LifeTime 的属性值, 将它们存储在两个整数中,并将这两个整数添加到 Groupname Groceries 下每个孩子的 LifeTime

输出:

<Group Name = "Groceries">
 <Lifetime Creation="2015" Expiration="2018" />
   <Brown Vegetables>
      <Potatoes>
     <LifeTime Creation ="2015" Expiration ="2018"/>
       </Potatoes>
   </Brown Vegetables>
  <Green Vegetables>
            <Lettuce>
     <LifeTime Creation ="2016" Expiration ="2019"/>
       </Lettuce>
  <Green Vegetables>
   </Group>

问题是: 我不知道 xml 的完整结构,因此在 Group Name 上方可能还有一些其他父节点。我只知道命名空间

我尝试过这样的事情::

 var value = (from c in doc.Descendants("Position") curr.Attribute("X").Value == "");

但我得到的只是空值..所以读数不正确

【问题讨论】:

  • 这是在开玩笑吗?
  • 没有。我只是 xml 解析的新手
  • 您正在寻找一个名为“位置”的元素?为什么?
  • 我的错,正在解析另一个 xml 文档并从那里取行。因此,从我从 MSDN 中读到的内容来看,在我的情况下,后代将是 Descendands(Group) 和 curr.Attribute(Creation) 和 (Expiration) 类似的东西
  • 尝试以下操作: var elements = doc.Descendants().Where(x => x.Attributes().Select(y => (string)y == "").Any()) .ToList();

标签: c# xml xml-parsing


【解决方案1】:

我不知道您正在使用的命名空间,因此在下面的代码中按名称获取元素看起来有点混乱。所以让我说清楚,不要只是复制和粘贴。使用它显示的逻辑,然后创建您自己的更整洁的版本。反正。下面的代码应该做你想做的事

 var groceries = xDoc.Descendants("Group").Where(d => d.Attributes("Name").FirstOrDefault().Value == "Groceries");

        foreach (var grocery in groceries)
        {
            var lifeTimeNode = grocery.Elements().FirstOrDefault(e => e.Name.LocalName == "Lifetime");
            var creationYear = int.Parse(lifeTimeNode.Attribute("Creation").Value);
            var expirationYear = int.Parse(lifeTimeNode.Attribute("Expiration").Value);
            var vegetableLifeTimes = grocery.Elements().Where(e => e.Name.LocalName != "Lifetime").Select(e => e.Descendants().FirstOrDefault(subE => subE.Name.LocalName == "LifeTime"));
            foreach (var vegLifeTime in vegetableLifeTimes)
            {
                var vegCreationModifier = int.Parse(vegLifeTime.Attribute("Creation").Value);
                var vegExpirationModifier = int.Parse(vegLifeTime.Attribute("Expiration").Value);

                var newExpiration = expirationYear + vegExpirationModifier;
                var newCreation = creationYear + vegCreationModifier;

                vegLifeTime.Attribute("Creation").Value = newCreation.ToString();
                vegLifeTime.Attribute("Expiration").Value = newExpiration.ToString();
            }
        }

请记住,您发布的 XML 实际上是无效的,元素名称中有空格,我很确定这不是大声的。

所以上面的代码适用于这种格式的 XML

<Group Name="Groceries">
  <Lifetime Creation="2015" Expiration="2018" />   
  <BrownVegetables>
    <Potatoes>
      <LifeTime Creation ="0" Expiration ="0"/>
    </Potatoes>
  </BrownVegetables>
  <GreenVegetables>
    <Lettuce>
      <LifeTime Creation="1" Expiration="1"/>
    </Lettuce>
    </GreenVegetables>
</Group>

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多