2013-07-22 70 views
21

我有一個看起來像這樣的的XElement:得到的XElement屬性值

<User ID="11" Name="Juan Diaz" LoginName="DN1\jdiaz" xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/" /> 

如何使用XML來提取的LoginName屬性的值?我嘗試了以下,但q2「枚舉沒有取得任何結果」。

var q2 = from node in el.Descendants("User") 
    let loginName = node.Attribute(ns + "LoginName") 
    select new { LoginName = (loginName != null) }; 
foreach (var node in q2) 
{ 
    Console.WriteLine("LoginName={0}", node.LoginName); 
} 

回答

26
var xml = @"<User ID=""11"" 
        Name=""Juan Diaz"" 
        LoginName=""DN1\jdiaz"" 
        xmlns=""http://schemas.microsoft.com/sharepoint/soap/directory/"" />"; 

var user = XElement.Parse(xml); 
var login = user.Attribute("LoginName").Value; // "DN1\jdiaz" 
+0

請注意,XAttribute可以爲null(這裏不是),所以可能希望在獲取值之前進行空檢查。 – user420667

0

我結束了使用字符串操作來獲取值,所以我會張貼代碼,但我仍然希望看到一種XML方法,如果有的話。

string strEl = el.ToString(); 
string[] words = strEl.Split(' '); 
foreach (string word in words) 
{ 
    if (word.StartsWith("LoginName")) 
    { 
     strEl = word; 
     int first = strEl.IndexOf("\""); 
     int last = strEl.LastIndexOf("\""); 
     string str2 = strEl.Substring(first + 1, last - first - 1); 
     //str2 = "dn1\jdiaz" 
    } 
} 
+4

不要對XML進行字符串操作。 XML通常看起來很簡單,但事實並非如此。因此,請使用Microsoft提供的工具來解析它。 –

4
XmlDocument doc = new XmlDocument(); 
doc.Load("myFile.xml"); //load your xml file 
XmlNode user = doc.getElementByTagName("User"); //find node by tag name 
string login = user.Attributes["LoginName"] != null ? user.Attributes["LoginName"].Value : "unknown login"; 

的最後一行代碼,它的設置的string login,格式看起來像這樣...

var variable = condition ? A : B; 

它基本上是說,如果條件是true,變等於A,否則變量等於B.

+0

最後一個字符串應該是: 'string login = user.Attributes?[「LoginName」] ?? 「未知登錄名」;' –

2

from the docs for XAttribute.Value:

如果你所得到的值和屬性可能不存在,更方便使用顯式轉換操作符,屬性分配給可空類型,如stringInt32Nullable<T>。如果該屬性不存在,則可空類型設置爲null。

+0

以及引用文檔[link]中的第二個示例(https://msdn.microsoft.com/en-us/library/system.xml.linq.xattribute.value(v = vs.110 ).aspx)演示了轉換運算符的用法。 –