2013-07-22 8 views
21

Ho un XElement che assomiglia a questo:ottenere il valore dell'attributo XElement

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

Come posso utilizzare XML per estrarre il valore del LoginName attributo? Ho provato quanto segue, ma il q2 "Enumerazione non ha prodotto risultati".

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); 
} 

risposta

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

Nota che XAttribute può essere nullo (non qui sì), quindi potrebbe volere il controllo null prima di ottenere il valore. – user420667

0

ho finito per usare manipolazione di stringhe per ottenere il valore, quindi vi posterò quel codice, ma mi piace ancora di vedere un approccio XML se ce n'è uno.

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

Non eseguire manipolazioni di stringhe su XML. XML sembra semplice in generale, ma non lo è. Quindi, usa gli Strumenti forniti da Microsoft per analizzarlo. –

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"; 

L'ultima riga di codice, dove è l'impostazione della string login, il formato assomiglia a questo ...

var variable = condition ? A : B; 

E 'fondamentalmente dicendo che se la condizione è true, variabile è uguale a A, altrimenti la variabile è uguale a B.

+0

L'ultima stringa deve essere: 'string login = user.Attributes? [" LoginName "] ?? "login sconosciuto"; ' –

2

dai documenti per XAttribute.Valore:

se hai trovato il valore e l'attributo potrebbe non esistere, è più conveniente per utilizzare gli operatori di conversione esplicite, e assegnare l'attributo a un tipo nullable come string o Nullable<T> di Int32. Se l'attributo non esiste, allora il tipo nullable è impostato su null.

+0

E il secondo esempio nella documentazione di riferimento [collegamento] (https://msdn.microsoft.com/en-us/library/system.xml.linq.xattribute.value (v = vs.110) .aspx) dimostra l'utilizzo degli operatori di conversione. –