2014-02-16 2 views
0

Я кодировал Minecraft Launcher. Я спасаю пользовательские данные в файл XML с помощью этого кода:Как получить значения элемента XDocument

public static void SaveUserDetails(string username, string clientToken, 
    string accessToken, string UUID, int lengthOfPass) 
{ 
    XDocument user = new XDocument(
     new XDeclaration("1.0", "utf-8", "yes"), 
     new XComment(String.Format("User details -- {0}", username)), 
     new XElement("user", 
      new XElement("username", username), 
      new XElement("clientToken", clientToken), 
      new XElement("accessToken", accessToken), 
      new XElement("userUUID", UUID), 
      new XElement("lengthOfPass", lengthOfPass))); 
    SaveXDoc(user, Path.Combine(Variables.usersFolder, username + ".user")); 
} 

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

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!--User details - - Ilan321--> 
<user> 
    <username>Ilan321</username> 
    <clientToken>clienttoken</clientToken> 
    <accessToken>accesstoken</accessToken> 
    <userUUID>uuid</userUUID> 
    <lengthOfPass>5</lengthOfPass> 
</user> 

Теперь я хочу, чтобы прочитать значения внутри элементов. Я делаю так с этим кодом:

string details = null; 
XDocument doc = XDocument.Load(userFile); 
var data = from item in doc.Descendants("user") 
      select new 
      { 
       user = item.Element("username").Value, 
       clientToken = item.Element("clientToken").Value, 
       accessToken = item.Element("accessToken").Value, 
       userUUID = item.Element("userUUID").Value, 
       passLength = item.Element("lengthOfPass").Value 
      }; 
foreach (var thing in data) 
    details = thing.ToString(); // there is only one string 

Однако, я чувствую, как будто это очень непрофессионально (относительно Еогеасп, который перебирает через var data). Есть ли способ быстро получить все значения в формате строки вместо использования foreach? Я попытался преобразовать data в строку, но он просто превратил его в тип, а не в контент.

+0

Вы ищете 'allDetails = String.Join (Environment.NewLine, data);'? –

ответ

2

Вы можете сделать, как показано ниже

foreach (var thing in data) 
{ 
    details = string.Format("user :{0}, clientToken: {1}",thing.user,thing.clientToken); 
} 

Или лучше создать новый класс для пользователя, а затем вы можете overide the ToString method его

public class User 
{ 
    public string User { get; set; } 
    public string ClientToken { get; set; } 
    public string AccessToken { get; set; } 
    public string UserUUID { get; set; } 
    public string PassLength { get; set; } 


    public override string ToString() 
    { 
     return string.Format("user :{0}, clientToken: {1}, AccessToken: {2},UserUUID :{3}, PassLength:{4}", User, ClientToken, AccessToken, UserUUID, PassLength); 
    } 

} 

затем

var data = from item in doc.Descendants("user") 
      select new User 
      { 
       User = item.Element("username").Value, 
       ClientToken = item.Element("clientToken").Value, 
       AccessToken = item.Element("accessToken").Value, 
       UserUUID = item.Element("userUUID").Value, 
       PassLength = item.Element("lengthOfPass").Value 
      }; 
details = data.FirstOrDefault().ToString(); 
1

Если вы ожидаете один и только один узел использует First, чтобы получить единственный элемент:

details = data.First().ToString(); 

Если элемент может не присутствовать, используйте FirstOrDefault.

1

Вы могли бы сделать это вместо:

var item = doc.Element("user"); 

    var data = new 
    { 
     user = item.Element("username").Value, 
     clientToken = item.Element("clientToken").Value, 
     accessToken = item.Element("accessToken").Value, 
     userUUID = item.Element("userUUID").Value, 
     passLength = item.Element("lengthOfPass").Value 
    }; 

    details = data.ToString(); 

я получаю точно такой же результат, как вы получили с вашим кодом.

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