首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在linq中根据条件从特定的Xelement中获取值

如何在linq中根据条件从特定的Xelement中获取值
EN

Stack Overflow用户
提问于 2018-06-22 22:21:15
回答 1查看 74关注 0票数 0
代码语言:javascript
复制
` <waypoints>
    <waypoint>
      <properties>
        <property value="2.935860e+002" name="RangeAway" />
        <property value="2.000000e+000" name="Keel Clearance" />
        <property value="1" name="Display Name" />
        <property value="" name="OtherCharts" />
        <property value="0.000000e+000" name="ROT" />
        <property value="0" name="Stop Time" />
        <property value="-1.000000e+000" name="TTG" />
        <property value="0" name="NavWatchLevel" />
        <property value="2.271720e+002" name="BearingTo" />
        <property value="" name="BACharts" />
        <property value="1" name="TTG Calc" />
        <property value="1.000000e+001" name="SOG" />
        <property value="0" name="Locked" />
        <property value="0" name="Engine Status" />
        <property value="1" name="Max Position Fix" />
        <property value="0" name="Display Description" />
        <property value="5.000000e-001" name="Turn Radius" />
        <property value="0" name="Activate" />
        <property value="0" name="Type" />
        <property value="" name="ReferencePoint" />
        <property value="2.935860e+002" name="RangeTo" />
        <property value="38 28.346N" name="Latitude" />
        <property value="1" name="Leg Type" />
        <property value="1.000000e-001" name="Port XTE" />
        <property value="WP_001" name="Name" />
        <property value="-1.000000e+000" name="TIME Zone" />
        <property value="0" name="PilotSign" />
        <property value="2.271720e+002" name="BearingAway" />
        <property value="51025A43-BBC9-4E95-8E92-84AF4E6AC872" name="ID" />
        <property value="" name="PassingTime" />
        <property value="0" name="Index" />
        <property value="1.000000e-001" name="Stbd XTE" />
        <property value="N/A" name="ETA" />
        <property value="009 22.978W" name="Longitude" />
      </properties>
      <description />
    </waypoint>
    <waypoint>
      <properties>
        <property value="4.365710e+002" name="RangeAway" />
        <property value="2.000000e+000" name="Keel Clearance" />
        <property value="1" name="Display Name" />
        <property value="" name="OtherCharts" />
        <property value="1.909859e+001" name="ROT" />
        <property value="0" name="Stop Time" />
        <property value="2.935860e+001" name="TTG" />
        <property value="0" name="NavWatchLevel" />
        <property value="2.131972e+002" name="BearingTo" />
        <property value="" name="BACharts" />
        <property value="1" name="TTG Calc" />
        <property value="1.000000e+001" name="SOG" />
        <property value="0" name="Locked" />
        <property value="0" name="Engine Status" />
        <property value="1" name="Max Position Fix" />
        <property value="0" name="Display Description" />
        <property value="5.000000e-001" name="Turn Radius" />
        <property value="0" name="Activate" />
        <property value="0" name="Type" />
        <property value="" name="ReferencePoint" />
        <property value="4.365710e+002" name="RangeTo" />
        <property value="35 08.505N" name="Latitude" />
        <property value="1" name="Leg Type" />
        <property value="1.000000e-001" name="Port XTE" />
        <property value="WP_002" name="Name" />
        <property value="-1.000000e+000" name="TIME Zone" />
        <property value="0" name="PilotSign" />
        <property value="2.131972e+002" name="BearingAway" />
        <property value="51025A43-BBC9-4E95-8E92-84AF4E6AC872" name="ID" />
        <property value="" name="PassingTime" />
        <property value="1" name="Index" />
        <property value="1.000000e-001" name="Stbd XTE" />
        <property value="01/08 21:11:17(+01)" name="ETA" />
        <property value="013 51.175W" name="Longitude" />
      </properties>
      <description />
    </waypoint>
</waypoints>` 

我有一个如上所述的文件,我想要获取名称属性包括“纬度”、“经度”、“转弯半径”、"BearingTo“、"RangeTo”的那些Xelement的值,并将这些值分配给对象的不同属性。该对象具有类似于name属性的值的属性。这个文件有9个节点,所以我应该能够从这个文件中生成9个对象。我已经试过了

代码语言:javascript
复制
var wayPointCollection = (from property in properties where property.LastAttribute.Value.Equals("Latitude") 
select new LocationEntity
{
    LATITUDE = (property.FirstAttribute.Value)
}

但在我的方法中,我只能检查一个属性并获取与其关联的值。如何使用LINQ或Lambda实现此目标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-23 02:51:33

您可以使用LINQ to XML来收集每个路点,并将其属性转换为Dictionary,这样您就可以检索所需的路点:

代码语言:javascript
复制
var ans = xd.Descendants("waypoint")
            .Select(wp => {
                var wpd = wp.Descendants("property")
                            .ToDictionary(wpp => wpp.Attribute("name").Value, wpp => wpp.Attribute("value").Value);
                return new LocationEntity {
                    Latitude = wpd["Latitude"],
                    Longitude = wpd["Longitude"],
                    TurnRadius = wpd["Turn Radius"],
                    BearingTo = wpd["BearingTo"],
                    RangeTo = wpd["RangeTo"]
                };
            });

ans将是一个包含所有转换后的航点的List<LocationEntity>

或者,您可以创建一个帮助器类,用于搜索属性子体以检索属性值:

代码语言:javascript
复制
public class XMLWaypoint {
    IEnumerable<XElement> xmlwp;

    public XMLWaypoint(XElement x) {
        xmlwp = x.Descendants("property");
    }

    public string this[string propName]
    {
        get
        {
            return xmlwp.FirstOrDefault(wpp => wpp.Attribute("name").Value == propName)?.Attribute("value").Value;
        }
    }
}

然后,您可以根据需要使用以下代码来查找每个属性:

代码语言:javascript
复制
var ans2 = xd.Descendants("waypoint")
             .Select(wp => {
                 var xwp = new XMLWaypoint(wp);

                 return new LocationEntity {
                     Latitude = xwp["Latitude"],
                     Longitude = xwp["Longitude"],
                     TurnRadius = xwp["Turn Radius"],
                     BearingTo = xwp["BearingTo"],
                     RangeTo = xwp["RangeTo"]
                 };
             });

您还可以创建一个使用反射自动映射到对象中的属性的方法,但这似乎有点过头了,而且您还会遇到属性名称与对象属性名称不匹配的问题(例如“转动半径”)。不过,它确实让我想到了LINQ to XML的一个有趣的扩展,那就是一个用于XML的实体框架。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50990031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档