var res = XDocument.Load("yourpath")
.Descendants("Users").Elements()
.Select(xe => xe.Name.LocalName);
を返したい場合はIEnumerable<XName>
then を使用し.Name
、返したい場合は use をIEnumerable<string>
使用しますName.LocalName
。それは私の意見ですが、あなたのクラスでは xdoc をプロパティとして設定します。
新しいアップデート
これは実際に今日 (2014 年 8 月 7 日) 賛成票を投じられ、それを見て自分の作品を批評するようになりました。その後、これは完全にがらくたであることに気付きました...
OPの質問でAaron Anodideがコメントしたように、Xmlアーキテクチャはすべて間違っていたため、これが非常に困難な作業でした...
くだらないコードを有効にしてしまったことを恥じてください。
くだらないコードを投稿して恥ずかしい
実際に実装する方法。VVVVV
XML:
<?xml version="1.0" encoding="utf-8" ?>
<ErrorServer>
<ClientIP>
<AllowAll>false</AllowAll>
<Address>127.0.0.1</Address>
</ClientIP>
<Users>
<User>
<Username>Admin</Username>
<Password>passw0r!d</Password>
<NextError>83</NextError>
<Active>true</Active>
</User>
<User>
<Username>JimBob</Username>
<Password>passw0r!d</Password>
<NextError>83</NextError>
<Active>true</Active>
</User>
</Users>
</ErrorServer>
クラス:
#region Referencing
using System;
using System.IO;
using System.Linq;
using System.Xml.Serialization;
#endregion
namespace Stack
{
public class Program
{
public Program()
{
ErrorServer = ErrorServer.Deserialize( "path" );
}
public ErrorServer ErrorServer { get; set; }
// This way you dont actually have to deal with LINQ and XML.
// It's just as easy to create a few classes to hold your data, so you can use xml serialization.
public User GetUserInfoByName( string name )
{
return
ErrorServer.Users.FirstOrDefault(
user => user.Username.Equals( name, StringComparison.CurrentCultureIgnoreCase ) );
}
}
[Serializable]
public class ErrorServer
{
public ClientIP ClientIP { get; set; }
[XmlArrayItem( "User" )]
public User[] Users { get; set; }
public static ErrorServer Deserialize( string path )
{
using (var stream = new FileStream( path, FileMode.Open ))
return new XmlSerializer( typeof (ErrorServer) ).Deserialize( stream ) as ErrorServer;
}
}
[Serializable]
public class ClientIP
{
public bool AllowAll { get; set; }
public string Address { get; set; }
}
[Serializable]
public class User
{
public string Username { get; set; }
public string Password { get; set; }
public double NextError { get; set; }
public bool Active { get; set; }
}
}
ですから、神の愛のために、線より下のものは使用しないでください。
アップデート
申し訳ありませんが、長くかかりました。これが私があなたのためにまとめた小さなクラスです。
using System;
using System.Linq;
using System.Xml.Linq;
namespace StackTesting
{
class Program
{
public class User
{
public string Username { get; set; }
public string Pass { get; set; }
public double Error { get; set; }
public bool Active { get; set; }
public User() { }
}
Public XDocument xDoc { get; set; }
static void Main(string[] args)
{
xDoc = XDocument.Load(@"C:\Users\Trae\Documents\visual studio 2012\Projects\StackTesting\StackTesting\XMLFile1.xml");
var user = (User) GetUserInfo("Admin");
}
public static User GetUserInfo(string UserName)
{
return xDoc.Root.Elements("Users").Elements()
.Where(xe => xe.Element(XName.Get("Username")).Value == UserName)
.Select(xe =>
new User
{
Username = xe.Element(XName.Get("Username")).Value,
Pass = xe.Element(XName.Get("Password")).Value,
Error = double.Parse(xe.Element(XName.Get("NextError")).Value),
Active = bool.Parse(xe.Element(XName.Get("Active")).Value)
}).ToArray()[0];
}
}
}