使用命名空间查询XML的问题

时间:2014-12-09 00:12:07

标签: c# xml namespaces

我正在尝试使用返回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;

2 个答案:

答案 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.Valuealready a string - 无需投出它:)