ASP.NET / XML:使用linq查询获取一个节点的值

时间:2014-09-29 14:39:53

标签: c# asp.net xml linq

我的想法很简单:我有这个XML:

 <Balance>
<LocationName>Location 1</LocationName>
<Longitude>39.74</Longitude>
<Latitude>-104.99</Latitude>
<RTI>
  <Container>12</Container>
  <Pallet>54</Pallet>
</RTI>
</Balance>
 <Balance>
<LocationName>Location 2</LocationName>
<Longitude>39.73</Longitude>
<Latitude>-104.8</Latitude>
<RTI>
  <Container>21</Container>
  <Pallet>45</Pallet>
</RTI>
 </Balance>

在ASP.NET项目中,我有一个控制器函数,它将一个名为 id 的String作为参数(例如,&#34;位置1和#34;)。我需要在这个XML文件中找到一个节点,其中location元素与给定的id具有相同的值,并将其数据复制到调用它的对象。最简单的方法是什么?我在这里有一些代码可视化我的意思:

控制器:

public PartialViewResult BalanceBarChart(String id)
{
    Balance balanceParam = new Balance(id);
    return PartialView(balanceParam);
}

上课:

public class Balance
{
    public String LocationName { get; set; }
    public int pallets { get; set; }
    public int containers { get; set; }
    public double Longitude { get; set; }
    public double Latitude { get; set; }


    public Balance(String id)
    {
        loadXMLData(id);
    }

    private void loadXMLData(String id)
    {
         XElement doc = XElement.Load("~/App_Data/saldotracking.xml");

        var queryResult =
            from result in doc.Elements("Balance")
            where (String)doc.Attribute("LocationName") == id
            select result;

            // copy results to class attributes
    }
} 

观点:

@model TodayIT.TrackOnline.Maps.Models.Balance

@model.LocationName 
@model.Longitude
//etc

关于Linq查询的结果,Linq上的Microsoft教程并不是很清楚。如果我做得对,变量 queryResult 应该只包含一个包含我想要的元素的Balance节点。如何将这些值复制到类属性?

1 个答案:

答案 0 :(得分:0)

可能最简单的方法是直接选择新对象,然后将它们复制到您正在使用的当前对象。这样,当您将模型传递给视图时,就会有数据供视图使用。

private void loadXMLData(String id)
{
     XElement doc = XElement.Load("~/App_Data/saldotracking.xml");

    var queryResult =
        from result in doc.Elements("Balance")
        where (String)doc.Attribute("LocationName") == id
        select new Balance
        {
            LocationName = LocationName,
            Longitude = Longitude
        };

        // copy results to class attributes
      foreach(var balance in Balance)
      {
          this.LocationName = balance.LocationName;
          this.Longitude = balance.Longitude;

      }
}