c#中如何获取xml的parent元素中的所有child元素

How to get all child elements in the parent element of xml in c#

认为这是我的 xml ..

<ListOfDestinations>
  <Destination>
    <City>Ahmedabad</City>
    <Title>Cheap Flights to Ahmedabad</Title>
    <Content>
    <Top10PlacestoVisit>
      <subTitle>1</subTitle>
      <details>d1</details>
      <subTitle>2</subTitle>
      <details>d2</details>
      <subTitle>3</subTitle>
      <details>d3</details>
      <subTitle>4</subTitle>
      <details>d4</details>
      <subTitle>5</subTitle>
      <details>d5</details>
      <subTitle>6</subTitle>
      <details>d6</details>
      <subTitle>7</subTitle>
      <details>d7</details>
      <subTitle>8</subTitle>
      <details>d8</details>
      <subTitle>9</subTitle>
      <details>d9</details>
      <subTitle>10</subTitle>
      <details>d10</details>
    </Top10PlacestoVisit>
    </Content>
   </Destination>
 </ListOfDestinations>

所以我想把所有 subTitledetails 变成一个 list.how 我能做吗 that.This 是我试过的。

XmlDocument DestinationXml = new XmlDocument();
DestinationXml.Load(Server.MapPath("~/Xml_Data/Destination.xml"));
var xdoc = XDocument.Parse(DestinationXml.InnerXml);


var selectedCity = xdoc.Descendants("ListOfDestinations")
                        .Select(d => d.Elements("Destination")
                        .Where(w => w.Element("City").Value == DesName));

在这个地方获取<Top10PlacestoVisit></Top10PlacestoVisit>

中的所有数据(副标题和详细信息)

然后我创建了一个 Model 并分配了像 this.but 这样的值我不能立即得到 subTitledetails 到 list.this 是什么我试过了

foreach (var itemz in selectedCity)
{
    var needed = itemz.Elements("Top10PlacestoVisit");
    foreach (var nitems in needed)
   {
       var getSubs = needed.Elements("details");
       foreach (var itm in getSubs)
       {
           details.Add(new Destinations
          {
               details = itm.Value
         });
       }
  }
}

ViewBag.details = details;

在这里它成功地获得了 subTitle 但我怎样才能获得 details 并在同一个 time.help 中分配它。

您的 xml 看起来结构不太好。从我的角度来看,将与之相关的 subTitledetails 放入一些封闭的父元素中是合理的,例如:

<Top10PlacestoVisit>
    <Place>
      <subTitle>1</subTitle>
      <details>d1</details>
    </Place>

无论如何,如果您受制于您发布的结构并且无法更改它 - 您仍然可以实现您的目标,例如:

var details = xdoc.XPathSelectElements(
       string.Format("/ListOfDestinations/Destination[City='{0}']/Content/Top10PlacestoVisit/details", DesName))
    .Select(d => new { subTitle = (d.PreviousNode as XElement).Value, details = d.Value})
    .ToList();

注意这里使用XPathSelectElements来获取details的集合是我个人的喜好,你可以随意使用。这里的关键思想是:

.Select(d => new { subTitle = (d.PreviousNode as XElement).Value, details = d.Value})

关于 details 个元素的集合。因此,您只是使用 XElementPreviousNode 属性 访问前一个兄弟元素,对于每个 details 元素,它恰好是其相关的 subTitle.

如果你坚持使用你的 XML,那么你可以通过假设结构使用这样的东西来做到这一点:

var topPlacesForCity = doc.Descendants("Destination")
    .Where(x => (string) x.Element("City") == "Ahmedabad")
    .Descendants("Top10PlacestoVisit")
    .Elements("subTitle")
    .Select(subTitle => new
    {
        SubTitle = subTitle.Value,
        Details = (string) subTitle.ElementsAfterSelf("details").First()
    });

如果,正如您在评论中提到的那样,您可以将其更改为包含父 Place 元素,那么它会更加稳健和明显:

var topPlacesForCity = doc.Descendants("Destination")
    .Where(x => (string) x.Element("City") == "Ahmedabad")
    .Descendants("Top10PlacestoVisit")
    .Elements("Place")
    .Select(place => new
    {
        SubTitle = (string) place.Element("subTitle"),
        Details = (string) place.Element("details")
    });

顺便说一句,没有理由将您的 XML 加载到 XmlDocument 中,然后直接将其解析为 XDocument 并将其丢弃。请改用 XDocument.Load(Server.MapPath("..."))

像这样尝试,将您的 subTitle 作为 Attribute 添加到 details 标签内,像这样

<Top10PlacestoVisit>

  <details subTitle ="place01">d1</details>

</Top10PlacestoVisit>

那就这样称呼吧

XElement xe = XElement.Load(Server.MapPath("your path"));

            var check = xe.Descendants("Destination")
                        .Where(n => n.Element("City").Value == "Ahmedabad")
                        .Select(l => l.Element("Top10PlacestoVisit"));

            List<someList> dst = new List<someList>();
          foreach (var item in check)
          {
              var subs = item.Elements("details");
              foreach(var item1 in subs)
              {
                  dst.Add(new someList 
                  {
                      detail = item1.Value,
                      subtitle = item1.Attribute("subTitle").Value

                  });
              }
          }

          ViewBag.all = dst;