Проблема с преобразованием XML-документа в строковый массив

2 Arun Rana [2012-03-13 11:35:00]

Я получаю результат 0 count, когда я преобразовываю XML в строковый массив, используя объект XDcoument для строкового массива, как показано ниже.

Stream dataStream = response.GetResponseStream();

XDocument doc = XDocument.Load((dataStream));

var services = from s in doc.Descendants("Location")
               select (string)s.Element("Name");

string[] locationArray = services.ToArray();

doc соответствует ниже

<Locations xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Location>
    <Name>Anywhere US</Name>
  </Location>
  <Location>
    <Name>South Central US</Name>
  </Location>
  <Location>
    <Name>Anywhere Europe</Name>
  </Location>
  <Location>
    <Name>West Europe</Name>
  </Location>
  <Location>
    <Name>Anywhere Asia</Name>
  </Location>
  <Location>
    <Name>Southeast Asia</Name>
  </Location>
  <Location>
    <Name>East Asia</Name>
  </Location>
  <Location>
    <Name>North Central US</Name>
  </Location>
  <Location>
    <Name>North Europe</Name>
  </Location>
</Locations>

Что должно быть неправильно с кодом для извлечения массива имени местоположения?

linq linq-to-xml c#-4.0


2 ответа


1 Решение gideon [2012-03-13 11:59:00]

Интересная проблема:

Из-за вашего пространства имен xmlns, имена всех элементов имеют это пространство имен. Это работает:

 var locations = from s in 
              doc.Descendants("{http://schemas.microsoft.com/windowsazure}Name")
                 select s.Value;

locations теперь содержит все ваши местоположения

Чтобы сделать его более читаемым, вы можете сделать это:

  var services = from s in doc.Descendants()
                 where s.Name.LocalName == "Location"
                 select s.Value;

1 Jehof [2012-03-13 11:57:00]

У вас есть определение пространства имен в элементе Locations. Таким образом, имя элемента {http://schemas.microsoft.com/windowsazure} Местоположение, а не местоположение.

Если вы удалите определение пространства имен из элемента Locations, тогда ваш запрос будет выполнен правильно и вернет счет из 9 элементов местоположения