我正在尝试使用返回XML响应的Rest服务。我已成功发出get请求,我的问题是处理响应。响应包括一个似乎搞乱了我的linq查询的命名空间。我已经尝试了几乎所有我能想到的用户名总是空的。任何帮助将不胜感激,可能会拯救我的理智。
<?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 :(得分: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;
答案 1 :(得分:0)
您的user
元素包含属性name
,而不是names
包装元素。相应地调整你的xpath :(你使用XNamespace
就可以了)
var userNames = from a in users.Descendants(ns + "user")
select a.Attribute("name").Value;
次要 - Attribute.Value
是already a string - 无需投出它:)