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>
所以我想把所有 subTitle
和 details
变成一个 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 这样的值我不能立即得到 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
并在同一个 time.help 中分配它。
您的 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
个元素的集合。因此,您只是使用 XElement
的 PreviousNode
属性 访问前一个兄弟元素,对于每个 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;
认为这是我的 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>
所以我想把所有 subTitle
和 details
变成一个 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 这样的值我不能立即得到 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
并在同一个 time.help 中分配它。
您的 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
个元素的集合。因此,您只是使用 XElement
的 PreviousNode
属性 访问前一个兄弟元素,对于每个 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;