如何使用 LINQ select 特定元素名称?
How do I select specific element name by using LINQ?
如何 select 每个 <Event>
其中包含 <tweet>
元素并从下面的 xml 文件中跳过 <facebook-status-update>
并显示其中的值使用 LINQ?假设 xml 文件中有很多不同的事件,我只想 select 带有 <tweet>
元素的 <Event>
及其内容
XML 文件内容:
<?xml version="1.0"?>
<Letter>
<Body>
<Event>
<eventid>ID1</eventid>
<tweet>
<text>Tweet update</text>
<location>
<lat>123</lat>
<long>456</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</tweet>
</Event>
<Event>
<eventid>ID2</eventid>
<facebook-status-update>
<text>facebook status update</text>
<location>
<lat>789</lat>
<long>101</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</facebook-status-update>
</Event>
<Event>
<eventid>ID3</eventid>
<tweet>
<text>Tweet update</text>
<location>
<lat>121</lat>
<long>314</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</tweet>
</Event>
</Body>
</Letter>
我正在使用 TwitterEvent class 来存储从 xml 文件获取的事件值,我只能 select 第一个 <tweet>
元素使用此 C# 代码:
XDocument xmldoc = XDocument.Load(@"C:\Users\JACK\source\repos\LINQToObject\LINQToObject\Resources\xmlFile.xml");
var someEvents = (from _event in xmldoc.Descendants("Body").Elements("Event")
select new TwitterEvent
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Elements("text").First().Value,
Latitude = _event.Descendants("location").Elements("lat").First().Value,
Longitude = _event.Descendants("location").Elements("long").First().Value,
DateTimeStamp = _event.Descendants("tweet").Elements("datetimestamp").First().Value
});
预期输出:
ID1 Tweet update 123 456 datetimestamp
ID3 Tweet update 121 314 datetimestamp
我不确定这是否正确,但你可以试试。
我创建了一个函数来检查像 here
这样的元素
public static string TryGetElementValue(XElement parentEl, string elementName, string defaultValue = null)
{
var foundEl = parentEl.Element(elementName);
if (foundEl != null)
{
return foundEl.Value;
}
return defaultValue;
}
然后我尝试添加 where
来检查“tweet”元素:
List<TwitterEvent> someEvents;
someEvents = (from _event in xmldoc.Descendants("Body").Elements("Event")
where TryGetElementValue(_event, "tweet") != null
select new TwitterEvent()
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Elements("text").First().Value,
Latitude = _event.Descendants("location").Elements("lat").First().Value,
Longitude = _event.Descendants("location").Elements("long").First().Value,
DateTimeStamp = _event.Descendants("tweet").Elements("datetimestamp").First().Value
}).ToList<TwitterEvent>();
你也可以试试这个。每个起始节点,如 tweet 或 location 都将是 return 数组。所以,你需要 select 从那开始。
var events = XDocument.Load(@"D:\Github\EF\EF.Console\XMLFile1.xml").Descendants("Event");
var eventResult = events.Where(x=>x.Element("tweet")!=null)
.Select(_event => new Event
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Select(x => x.Element("text").Value).FirstOrDefault(),
DateTimeStamp = _event.Descendants("tweet").Select(x => x.Element("datetimestamp").Value).FirstOrDefault(),
Lat = _event.Descendants("tweet").Select(x => x.Descendants("location").Select(y => y.Element("lat").Value).FirstOrDefault()).FirstOrDefault(),
Long = _event.Descendants("tweet").Select(x => x.Descendants("location").Select(y => y.Element("long").Value).FirstOrDefault()).FirstOrDefault()
});
如何 select 每个 <Event>
其中包含 <tweet>
元素并从下面的 xml 文件中跳过 <facebook-status-update>
并显示其中的值使用 LINQ?假设 xml 文件中有很多不同的事件,我只想 select 带有 <tweet>
元素的 <Event>
及其内容
XML 文件内容:
<?xml version="1.0"?>
<Letter>
<Body>
<Event>
<eventid>ID1</eventid>
<tweet>
<text>Tweet update</text>
<location>
<lat>123</lat>
<long>456</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</tweet>
</Event>
<Event>
<eventid>ID2</eventid>
<facebook-status-update>
<text>facebook status update</text>
<location>
<lat>789</lat>
<long>101</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</facebook-status-update>
</Event>
<Event>
<eventid>ID3</eventid>
<tweet>
<text>Tweet update</text>
<location>
<lat>121</lat>
<long>314</long>
</location>
<datetimestamp>datetimestamp</datetimestamp>
</tweet>
</Event>
</Body>
</Letter>
我正在使用 TwitterEvent class 来存储从 xml 文件获取的事件值,我只能 select 第一个 <tweet>
元素使用此 C# 代码:
XDocument xmldoc = XDocument.Load(@"C:\Users\JACK\source\repos\LINQToObject\LINQToObject\Resources\xmlFile.xml");
var someEvents = (from _event in xmldoc.Descendants("Body").Elements("Event")
select new TwitterEvent
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Elements("text").First().Value,
Latitude = _event.Descendants("location").Elements("lat").First().Value,
Longitude = _event.Descendants("location").Elements("long").First().Value,
DateTimeStamp = _event.Descendants("tweet").Elements("datetimestamp").First().Value
});
预期输出:
ID1 Tweet update 123 456 datetimestamp
ID3 Tweet update 121 314 datetimestamp
我不确定这是否正确,但你可以试试。
我创建了一个函数来检查像 here
这样的元素public static string TryGetElementValue(XElement parentEl, string elementName, string defaultValue = null)
{
var foundEl = parentEl.Element(elementName);
if (foundEl != null)
{
return foundEl.Value;
}
return defaultValue;
}
然后我尝试添加 where
来检查“tweet”元素:
List<TwitterEvent> someEvents;
someEvents = (from _event in xmldoc.Descendants("Body").Elements("Event")
where TryGetElementValue(_event, "tweet") != null
select new TwitterEvent()
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Elements("text").First().Value,
Latitude = _event.Descendants("location").Elements("lat").First().Value,
Longitude = _event.Descendants("location").Elements("long").First().Value,
DateTimeStamp = _event.Descendants("tweet").Elements("datetimestamp").First().Value
}).ToList<TwitterEvent>();
你也可以试试这个。每个起始节点,如 tweet 或 location 都将是 return 数组。所以,你需要 select 从那开始。
var events = XDocument.Load(@"D:\Github\EF\EF.Console\XMLFile1.xml").Descendants("Event");
var eventResult = events.Where(x=>x.Element("tweet")!=null)
.Select(_event => new Event
{
EventID = _event.Element("eventid").Value,
TweetText = _event.Descendants("tweet").Select(x => x.Element("text").Value).FirstOrDefault(),
DateTimeStamp = _event.Descendants("tweet").Select(x => x.Element("datetimestamp").Value).FirstOrDefault(),
Lat = _event.Descendants("tweet").Select(x => x.Descendants("location").Select(y => y.Element("lat").Value).FirstOrDefault()).FirstOrDefault(),
Long = _event.Descendants("tweet").Select(x => x.Descendants("location").Select(y => y.Element("long").Value).FirstOrDefault()).FirstOrDefault()
});