xml后代在c#中循环问题

时间:2015-01-18 17:43:02

标签: c# xml

我无法在循环时从xml获取值,我想获取HostedService中每个元素的值。对于例如服务名称,网址等。

以下是我的代码

XDocument doc;
using (Stream input = System.IO.File.OpenRead(@"D:\Test.xml"))
{
    doc = XDocument.Load(input);

    foreach (var events in doc.Root.Descendants("HostedServices")) // loop through all events
    {

    }
}

XML示例:

<HostedServices     xmlns="http://schemas.microsoft.com/windowsazure"xmlns:i="http://www.w3.org/2001/XMLSchema-instance">                 
<HostedService>
    <Url>https://www.google.com</Url>
    <ServiceName>sharepoint2013vm</ServiceName>
    <HostedServiceProperties>
      <Description i:nil="true" />
      <Location>East Asia</Location>
      <Label>c2hhcmVwb2ludDIwMTN2bQ==</Label>
      <Status>Created</Status>
      <DateCreated>2015-01-13T03:42:21Z</DateCreated>
      <DateLastModified>2015-01-13T03:42:46Z</DateLastModified>
      <ExtendedProperties>
        <ExtendedProperty>
          <Name>ResourceGroup</Name>
          <Value>sharepoint2013vm</Value>
        </ExtendedProperty>
        <ExtendedProperty>
          <Name>ResourceLocation</Name>
          <Value>East Asia</Value>
        </ExtendedProperty>
      </ExtendedProperties>
    </HostedServiceProperties>
  </HostedService>
  <HostedService>

  </HostedService>
</HostedServices>

3 个答案:

答案 0 :(得分:1)

这是一种方法。

        XDocument doc;

        using (Stream input = System.IO.File.OpenRead("XMLFile1.xml"))
        {
            doc = XDocument.Load(input);

            XmlNamespaceManager nm = new XmlNamespaceManager(new NameTable());
            XNamespace ns = doc.Root.GetDefaultNamespace();
            nm.AddNamespace("ns", ns.NamespaceName);

            foreach (var hostedService in doc.Root.XPathSelectElements("ns:HostedService",nm)) // loop through all events
            {
                if (hostedService.XPathSelectElement("ns:ServiceName", nm) != null)
                {
                    var service = hostedService.XPathSelectElement("ns:ServiceName",nm).Value;
                }
                if (hostedService.XPathSelectElement("ns:Url",nm) != null)
                {
                    var url = hostedService.XPathSelectElement("ns:Url",nm).Value;
                }
            }
        }

答案 1 :(得分:1)

使用此:

XDocument doc = XDocument.Load(@"D:\Test.xml");

将XML文件加载到内存中。

您必须使用XNamespace,因为您的原始XML声明了一个:

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

要遍历<HostedService>的所有元素,请使用此:

foreach (var events in doc.Descendants(ns+"HostedService").Elements()) 
{

}

上述foreach将允许您访问Elements()的所有 <HostedService>,即

  1. <Url>
  2. <ServiceName>
  3. <HostedServiceProperties>
  4. 另一方面,如果您要访问<HostedService>下面的所有元素(包括子元素等),请使用以下内容;

     foreach (var events in doc.Descendants(ns + "HostedService").DescendantNodes().OfType<XElement>())
     {
     }
    

    以上内容可让您访问:

    1. <Url>
    2. <ServiceName>
    3. <HostedServiceProperties>
    4. <Description>
    5. <Location>
    6. <Label>
    7. ......等。

答案 2 :(得分:0)

您需要使用元素名称指定XML命名空间:

XNamespace ns = "http://schemas.microsoft.com/windowsazure";
foreach (var events in doc.Root.Descendants(ns + "HostedServices"))
{

}

有关详细信息,请查看Working with XML Namespaces