解析XElement - 获取元素

时间:2013-04-02 09:44:05

标签: c# xml linq linq-to-xml

我目前有一个XElement。我用它来打印它:

System.Diagnostics.Debug.WriteLine(hostedServices);

结果:

<HostedServices xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <HostedService>
    <Url>url</Url>
    <ServiceName>testcloudservice2</ServiceName>
    <HostedServiceProperties>
      <Description>New cloud service</Description>
      <Location>West Europe</Location>
      <Label>dGVzdGNsb3Vkc2VydmljZTI=</Label>
      <Status>Created</Status>
      <DateCreated>2013-04-02T09:40:27Z</DateCreated>
      <DateLastModified>2013-04-02T09:40:26Z</DateLastModified>
      <ExtendedProperties />
    </HostedServiceProperties>
  </HostedService>
  <HostedService>
    <Url>url</Url>
    <ServiceName>testtesttest123445</ServiceName>
    <HostedServiceProperties>
      <Description>New cloud service</Description>
      <Location>West Europe</Location>
      <Label>dGVzdHRlc3R0ZXN0MTIzNDQ1</Label>
      <Status>Created</Status>
      <DateCreated>2013-04-02T09:30:34Z</DateCreated>
      <DateLastModified>2013-04-02T09:30:34Z</DateLastModified>
      <ExtendedProperties />
    </HostedServiceProperties>
  </HostedService>
</HostedServices>

我想获取每个<HostedService>的ServiceName和Description。我怎么能得到这些?

4 个答案:

答案 0 :(得分:2)

您应该使用XNamespace来选择元素:

XDocument xdoc = XDocument.Load(path_to_xml);
XNamespace ns = "http://schemas.microsoft.com/windowsazure";
var hostedServices = 
            from s in xdoc.Descendants(ns + "HostedService")
            select new
            {
                ServiceName = (string)s.Element(ns + "ServiceName"),
                Description = (string)s.Element(ns + "HostedServiceProperties")
                                       .Element(ns + "Description")
            };

这将返回具有属性ServiceNameDescription的匿名对象序列。用法:

foreach(var service in hostedServices)
   Debug.WriteLine(service.ServiceName + ": " + service.Description);

答案 1 :(得分:1)

var xml = XDocument.Parse(s);

XNamespace ns = "http://schemas.microsoft.com/windowsazure";

var descriptions = xml.Descendants(ns + "HostedService")
                      .Select(prop => 
                              new { Description =  prop.Element(ns + "ServiceName").Value, 
                                    ServiceName =  prop.Descendants(ns + "Description").First().Value});

//LINQPad specific print call                
descriptions.Dump();

打印:

Description        ServiceName 
testcloudservice2  New cloud service 
testtesttest123445 New cloud service 

答案 2 :(得分:0)

尝试:

var descriptions = hostedServices.Elements().Select(
    x=> x.Descendants(y=>y.Name=="Description").FirstOrDefault());
var serviceNames = hostedServices.Elements().Select(
    x=> x.Descendants(y=>y.Name=="ServiceName").FirstOrDefault());

如果你想要他们加:

var descAndNames = hostedServices.Elements().Select(
    x=> new { Name =  x.Descendants(y=>y.Name=="ServiceName").FirstOrDefault(),
              Description = x.Descendants(y=>y.Name=="Description")
                   .FirstOrDefault()
    });

答案 3 :(得分:0)

这里棘手的时刻是你需要考虑名称空间

XNamespace ns = "http://schemas.microsoft.com/windowsazure";
var serviceNames = element.Descendants(ns + "ServiceName");
var descriptions = element.Descendants(ns + "Description");

var serviceNameValues = serviceNames.Select(x => x.Value);
var descriptionValues = descriptions.Select(x => x.Value);