2013-04-02 189 views
0

我目前有一个XElement。我使用它来打印:解析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>的服务名称和说明。我怎样才能得到这些?

回答

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 
+0

我相信所有的服务都有名字:)我认为你的解决方案也是正确的,只要流利的语法,我的+1返回 –

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() 
    }); 
+0

谢谢,但。选择是不可能上的XElement .. – Bv202

+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); 
+0

aw,+1,如果'Element'返回,我的解决方案会抛出'NullReferenceException' null,而您将节点转换为'string',它不会在'null'上抛出任何异常 –

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);