【问题标题】:How do i traverse through an xml document that has identical elements? [closed]如何遍历具有相同元素的 xml 文档? [关闭]
【发布时间】:2016-03-05 22:35:14
【问题描述】:

我有以下 xml 文件

<Universe id="123nebula" name="winterfell"  parentId="0">
  <planet id="gio234" name="bobka grantos">
    <planet id="tyu88" name="viola winter" description="dgdgdddgddgdddgd"/>
  </planet>
  <planet id="huio90" name="bintor nardi" description="dedededddddddddd"/>
  <planet id="ruil99" name="torian fartknox" description="llllklklklkkllk"/>
  <planet id="huy7777" name="vivalid durol" description="ppppppppppssssss"/>
  <planet id="fila7866" name="hella fella dorrrah">
    <planet id="asaaa23" name="Sixty two nine pine" description="ffffffffdfdfd"/>
    <planet id="tyu88" name="viola winter" description="dgdgdddgddgdddgd"/>
    <planet id="juiiko8" name="tae bo" description="jujujioooppoiiu"/>
  </planet>
</Universe>

在这里,有些行星是由它们自己存在的,有些行星有子行星。由于所有父行星和子行星都具有相同的元素名称“行星”,因此识别父行星的唯一方法是查找 description attribute,其中只有子(子)行星具有“描述”attribute.

我想做两件事:

  1. 我需要得到id = fila7866的父行星的所有子行星
  2. 我想获取所有没有子行星的行星

更新 这需要使用 LINQ-2-XML 完成!

我该怎么做?

【问题讨论】:

  • 不喜欢看起来太老套,但尽管如此 - 您在发布之前实际上尝试过什么?网上有很多关于如何使用 X(ml)Document 的信息,我敢肯定,即使是遍历这样的树,也至少有很少的命中率。如果您有实际问题,请提供一些可以demonstrate it 的代码。
  • @EugenePodskal 它应该使用 LINQ-2-XML 完成,我用它更新了我的帖子
  • 我仍然非常确信您应该尝试自己解决这个问题。但那是你自己的事……
  • @EugenePodskal 我知道如何获取元素,如果它们有多种和特定的 xpath 模式,但在这种情况下,除了根元素之外所有元素都具有相同的名称。我相信这是独一无二的
  • 但是您是否尝试过使用某些 xpath,假设这些元素不是唯一的?我可以向您保证,使用完全限定的 xpath,节点的命名方式没有区别。它们都可以具有相同的名称 - 这实际上并不重要。

标签: c# xml linq asp.net-mvc-4 linq-to-xml


【解决方案1】:

试试这个...

using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using System.Linq;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        // Deserialize single instance
        XmlSerializer serializerSingle = new XmlSerializer(typeof(Universe));//, new XmlRootAttribute("document"));
        using (FileStream stream = File.OpenRead(@"<Path to your XML data>\planet.xml"))
        {
            // 'ReadXML.Xml2CSharp.Document' is the 'Document' class in your XML Classes
            Universe dezerializedXMLSingle = (Universe)serializerSingle.Deserialize(stream);

            var SubPlanets = (from p in dezerializedXMLSingle.Planet where p.Id == "fila7866" select p.Planets).ToList();

        } // Put a break-point here, then mouse-over dezerializedXMLSingle
    }
}
}

[XmlRoot(ElementName="planet")]
public class Planet {
    [XmlAttribute(AttributeName="id")]
    public string Id { get; set; }
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName="description")]
    public string Description { get; set; }
    [XmlElement(ElementName="planet")]
    public List<Planet> Planets { get; set; }
}

[XmlRoot(ElementName="Universe")]
public class Universe {
    [XmlElement(ElementName="planet")]
    public List<Planet> Planet { get; set; }
    [XmlAttribute(AttributeName="id")]
    public string Id { get; set; }
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName="parentId")]
    public string ParentId { get; set; }
}

我将您的 XML 存储在一个文件中并反序列化为一个名为 dezerializedXMLSingle 的对象...实际上非常酷,因为如果您在代码中的 dezerializedXMLSingle 行之后放置一个断点,然后将鼠标悬停并检查数据'dezerializedXMLSingle' 对象的结构,你会看到每个行星,然后是与这些行星相关联的行星,在 fila7866 的情况下,你会看到 3 个 [子] 行星....希望有所帮助....

【讨论】:

  • 两个吹毛求疵: 1. 它实际上并没有从反序列化结构中过滤所需的信息。 2.它没有按照OP的要求使用LINQ-to-XML
  • @EugenePodskal monty 的回复很好,他创建了一个具有这些属性的对象,但 Eugene 是正确的,它没有回答我的 OP 中的两个问题,所以我不能给分
  • @Monty 无意冒犯,但如果您关心“OP 永远不会为自己学习任何东西”,那么您可能不应该给出this answer at all。现在是 1. 回答不是最高质量的帖子 2. 没有完全回答问题的答案。 P.S.:仅仅修改你的答案以使用 Linq-to-XML 不会比写你之前的评论花费更多的时间:)。
  • @EugenePodskal 对不起,您在我们对 Monty 的评论中提到“回答不是最高质量的帖子”。好吧,Eugene 高质量的帖子通常是由专家发布的,并不是这里的每个人都是专家,论坛的整个想法是互相帮助,我已经阅读了 SO 指南,通过阅读它们给我的印象是 SO 期望帖子的作者成为专家级开发人员的中级水平 初学者和中间人会发生什么?
  • @blatheringbob 您还没有尝试任何方法来自行解决问题。好吧,您可能已经尝试过了,但帖子中没有任何内容表明这一点。高品质与成为专家无关 - 但与determination and attention to details 有很大关系。可惜你不想自己尝试解决这个问题。你可能会认为我和其他像我一样的人是个混蛋,但我们只想拥有受过良好教育的同事,他们可以编码并有一个可以提出问题的地方
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多