2016-01-22 9 views
1

думают, что это мой XML ..Как получить все дочерние элементы родительского элемента XML в C#

<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> 

, поэтому я хочу, чтобы получить все subTitle и details к list.how я могу сделать это. Это то, что я пробовал.

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)); 

в этом месте получить все данные (Subtitle и детали) внутри <Top10PlacestoVisit></Top10PlacestoVisit>

я создал Model и присвоенные значения, как this.but я не могу получить subTitle и details сразу к 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 и назначьте его в одно и то же время. Помогите мне с этим.

ответ

1

Если вы застряли с 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("...")).

+0

приятный work.its working.thank вы очень – bill

1

Ваш xml выглядит не совсем хорошо структурированным. С моей точки зрения, было бы разумно поставить subTitle и details, связанные с ним в какой-то ограждающих родительский элемент что-то вроде:

<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 элементов. Таким образом, вы просто обращаетесь к предыдущему элементу брата, используя PreviousNode свойство XElement, и для каждого элемента details это точно связано с его subTitle.

+0

что это 'XPathSelectElements' он не работает для меня – bill

+0

Это метод расширения находится в' System.Xml.XPath'. Убедитесь, что у вас есть ссылки на сборку System.Xml.Linq и использование этого пространства имен в вашем коде. –

+0

@ bill думаю, я добавил '' как parent.then ho могу ли я это сделать. – bill

0

попробовать, как это, добавьте 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; 
Смежные вопросы