2014-12-09 5 views
1

Я пытаюсь использовать службу Rest, которая возвращает ответ XML. Я успешно сделал запрос на получение, моя проблема заключается в обработке ответа. Ответ включает пространство имен, которое, по-видимому, испортило мой запрос linq. Я пробовал почти все, что я могу думать о том, что userNames всегда приходит пустым. Любая помощь была бы высоко оценена и могла бы спасти мое здравомыслие.Проблемы с запросом XML с пространством имен

<?xml version="1.0" encoding="UTF-8"?> 
<tsResponse xmlns="http://tableausoftware.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableausoftware.com/api http://tableausoftware.com/api/ts-api-2.0.xsd"> 
    <users> 
    <user id="c9274ce9-0daa-4aad-9bd2-3b1d6d402119" name="_DevITTemplate" role="Unlicensed" publish="false" contentAdmin="false" lastLogin="" externalAuthUserId=""/> 
string usersList = 
request.DownloadString("http://bshagena-sandbox/api/2.0/sites/b4126fe9-d7ee-4083-88f9-      a5eea1f40416/users/"); 
request.Dispose(); 

XDocument xd; 
XElement users; 
XNamespace ns = "http://tableausoftware.com/api"; 

xd = XDocument.Parse(usersList); 
users = xd.Root.Elements().First(); 

var userNames = from a in users.Descendants(ns +"users") 
      select (string)a.Attribute("name").Value; 

ответ

0

Вот что я сделал, и это, казалось, работало. Извините за все комментарии. Я уверен, что это не самый эффективный способ сделать это. Надеюсь, это поможет кому-то еще потерять рассудок по той же проблеме.

// Sends get request and stores response as a string 
string usersList = 
request.DownloadString("http://<serverName>/api/2.0/sites/b4126fe9-d7ee-4083-88f9-a5eea1f40416/users/"); 
// declares an XML document object 
XDocument xd; 
// Declares and XML element object 
XElement users; 
// Declares a stupid XML namespace object 
XNamespace ns = "http://tableausoftware.com/api"; 
// Sets document to value of string 
xd = XDocument.Parse(usersList); 
// Sets the element to value of the first node of the xml document 
users = xd.Root.Elements().First(); 
// Creates an array and queries elements based on attribute of name 
var userNames = from a in users.Elements(ns + "user") 
      select (string)a.Attribute("name").Value; 
0

Это ваш user элемент, который содержит атрибут name, а не элемент names обертку. Настройте соответствующие XPath: (Ваше использование XNamespace отлично)

var userNames = from a in users.Descendants(ns + "user") 
       select a.Attribute("name").Value;   

Minor - Attribute.Value является already a string - не нужно, чтобы бросить его :)

+0

Спасибо за вашу помощь! – BFS