2016-05-09 2 views
0

からの読み取り私はこのようなxmlファイルがあります。xmlファイル

<?xml version="1.0" encoding="utf-8" ?> 
<LogOnUsersInfo> 
    <GeneralInformation> 
    <NumberOfUsers>2</NumberOfUsers> 
    <LastUser UserName="User1"/> 
    </GeneralInformation> 
    <LogOnUserCollection> 
    <LogOnUser UserName="User1" Password="password"> 
     <Rights> 
     <CanCreateProducts value="true"/> 
     <CanEditProducts value="true"/> 
     <CanDeleteProducts value="true"/> 
     <CanCreateLogIns value="true"/> 
     <CanDeleteLogIns value="true"/> 
     <CanBeDeleted value="true"/> 
     <HasDebugRights value="false"/> 
     </Rights> 
    </LogOnUser> 
    <LogOnUser UserName="User2" Password="password"> 
     <Rights> 
     <CanCreateProducts value="true"/> 
     <CanEditProducts value="true"/> 
     <CanDeleteProducts value="true"/> 
     <CanCreateLogIns value="true"/> 
     <CanDeleteLogIns value="true"/> 
     <CanBeDeleted value="true"/> 
     <HasDebugRights value="false"/> 
     </Rights> 
    </LogOnUser> 
    </LogOnUserCollection> 
</LogOnUsersInfo> 

をそして、私は言ったxmlファイル内の値と一致するプロパティを持つクラスがあります。私が試した

public class LogOnUser 
{ 
    #region NestedTypes 
    public class Rights 
    { 
     public bool CanCreateProducts { get; set; } 
     public bool CanEditProducts { get; set; } 
     public bool CanDeleteProducts { get; set; } 
     public bool CanCreateLogIns { get; set; } 
     public bool CanDeleteLogIns { get; set; } 

     public bool CanBeDeleted { get; set; } 
     public bool HasDebugRights { get; set; } 
    }; 
    #endregion 

    #region Members 
    string _UserName; 
    string _Password; 
    bool _LoggedIn; 
    Rights _UserRights; 

    #endregion 

    #region Construction 
    public LogOnUser() { } 

    public LogOnUser(string username) 
    { 
     _UserName = username; 
    } 

    public LogOnUser(string username, string password, bool cancreateproducts, bool caneditproducts, bool candeleteproducts, bool cancreatelogins, bool candeletelogins) 
    { 
     _UserName = username; 
     _Password = password; 

     _UserRights = new Rights(); 

     _UserRights.CanCreateProducts = cancreateproducts; 
     _UserRights.CanEditProducts = caneditproducts; 
     _UserRights.CanDeleteProducts = candeleteproducts; 
     _UserRights.CanCreateLogIns = cancreatelogins; 
     _UserRights.CanDeleteLogIns = candeletelogins; 
    } 
    #endregion 

    #region Properties 
    public string Username 
    { 
     get { return _UserName; } 
     set { _UserName = value; } 
    } 

    public string Password 
    { 
     get { return _Password; } 
     set { _Password = value; } 
    } 

    public bool LoggedIn 
    { 
     get { return _LoggedIn; } 
     set { _LoggedIn = value; } 
    } 

    public Rights UserRights 
    { 
     get { return _UserRights; } 
     set { _UserRights = value; } 
    } 
    #endregion 
} 

をXDocumentを使用してxmlファイルの特定の値をLogOnUserクラスのインスタンスに読み込むことはできますが、私はちょっと立ち往生してしまい、MSDNのドキュメントを辿って、探しているものが見つからない場合は、ここで質問をする。

まず、UserNameフィールドをXMLのUserNameプロパティのLogOnUserオブジェクトに読み込もうとしました。しかし、これは「LogOnUsersInfo」へUserNameを設定し

var XMLUser = XElement.Load(LogOnUserXMLFilePath); 

foreach(XElement e in XMLUser.DescendantsAndSelf()) 
{ 
    var user = new Model.LogOnUsers.LogOnUser(e.Name.ToString()); 
} 

ので、明らかに私はXMLに深く行く必要があるが、私は方法がわからない:私はこれを試してみました。

誰でも正しい方向に向けることができますか?

foreach(XElement e in XMLUser.Descendants("LogOnUser")) 
{ 
    var user = new Model.LogOnUsers.LogOnUser((string)e.Attribute("UserName")); 
} 

基本的に、あなたはXMLツリーに深い任意のレベルをダウンするDescendants()を使用することができ、およびXML属性にアクセスするためにAttribute()を使用します。

答えて

1

はスターターとして、あなたは次のように行うことができます。

その後権利情報は、例えば、以下のように得ることができます。

var cancreateproducts = (bool)e.Element("Rights") 
           .Element("CanCreateProducts") 
           .Attribute("value"); 
+0

完璧、ありがとう!どのようにして別のユーザーを検索するのですか?明らかに今私は2つだけ持っているが、それはかなりより多くなる可能性がある。ユーザーの名前を検索するか、たとえばユーザー名を検索する必要がありますか?あるいは、各ユーザの要素名を変更するほうが簡単なのでしょうか?オープンタグとして 'LogOnUser'を持っているのではなく、それぞれが異なっていますか? –

+0

私はあなたを正しく理解すれば、前者がより一般的なアプローチです。同じ種類の情報を持つXML要素に異なるタグ名を使用する、つまりユーザーがXMLを非常に厄介にする – har07

+1

特定のユーザーを見つけることは 'Where() 'を追加するだけで簡単です。 'XMLUser.Descendants( "LogOnUser")。ここで(o =>(文字列)o.Attribute( "UserName")== "User2") ' – har07

1

あなたは、XPath検索を行うことができます。すべてのユーザー情報を取得できます。

var nodes = doc.SelectNodes("//LogOnUser"); 
foreach(var node in nodes) 
{ 
    var username = node.Attributes["Username"]; 
}