2013-07-22 8 views
21

У меня есть XElement, который выглядит следующим образом:получить XElement значение атрибута

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

Как я могу использовать XML, чтобы извлечь значение атрибута LOGINNAME? Я попробовал следующее, но q2 «Enumeration не дал никаких результатов».

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 может быть нулевым (не здесь да), поэтому может потребоваться проверка нуля до получения значения. – 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

из документов для XAttribute.Один:

Если вы получаете значение и атрибут не может существовать, удобнее использовать явные операторы преобразования, и присвоить атрибут обнуляемого типа, такие как string или Nullable<T> из Int32. Если атрибут не существует, то для типа с нулевым значением устанавливается значение null.

+0

И второй пример в ссылочной документации [link] (https://msdn.microsoft.com/en-us/library/system.xml.linq.xattribute.value (v = vs.110)) .aspx) демонстрирует использование операторов преобразования. –

Смежные вопросы