C# 如何从动态代码中使用的特定节点访问子节点?

C# 如何从动态代码中使用的特定节点访问子节点?,c#,xml,C#,Xml,因此,我想从特定节点获取节点列表。在本课程中,我正在编写一个程序,将银行复制为“最终”形式,并编写了一个XML文档,其中包含我银行的所有客户机。我已经为登录函数编写了代码,现在我想返回特定客户机的详细信息 <clients> <client> <name>Victor Olin</name> <ssid>20000724</ssid> <pswd>stora

因此,我想从特定节点获取节点列表。在本课程中,我正在编写一个程序,将银行复制为“最终”形式,并编写了一个XML文档,其中包含我银行的所有客户机。我已经为登录函数编写了代码,现在我想返回特定客户机的详细信息

<clients>
    <client>
        <name>Victor Olin</name>
        <ssid>20000724</ssid>
        <pswd>storabanken</pswd>
        <savingsAcc>
          <name>Victors Sparkonto</name>
          <accountNumber>111-222-333</accountNumber>
          <balance>5000</balance>
        </savingsAcc>
        <regularAcc>
          <name>Victors Lönekonto</name>
          <accountNumber>222-333-444</accountNumber>
          <balance>314.15</balance>
        </regularAcc>
    </client>
</clients>

维克托·奥林
20000724
斯道拉班肯
斯巴孔托胜利者
111-222-333
5000
Lönekonto胜利者
222-333-444
314.15
所以想要的结果是,我想要一个节点列表,其中包含这个特定客户机拥有的所有“savingsAcc”和“regularAcc”,这样我就可以访问所有内部文本并将它们发送给客户机。当客户端使用正确的凭据登录时,将指定正确的客户端,我认为该节点可以充当根元素,但我不确定如何实现它。

使用Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            foreach (XElement client in doc.Descendants("client"))
            {
                Client newClient = new Client();
                Client.clients.Add(newClient);

                newClient.name = (string)client.Element("name");
                newClient.ssid = (string)client.Element("ssid");
                newClient.pswd = (string)client.Element("pswd");

                List<XElement> xAccounts = client.Elements().Where(x => (x.Name.LocalName == "savingsAcc") || (x.Name.LocalName == "regularAcc")).ToList();
                foreach (XElement xAccount in xAccounts)
                {
                    Account newAccount = null;
                    switch (xAccount.Name.LocalName)
                    {
                        case "savingsAcc" :
                            newAccount = new SavingsAccount();
                            break;
                        case "regularAcc":
                            newAccount = new RegularAccount();
                            break;
                    }
                    newClient.accounts.Add(newAccount);

                    newAccount.name = (string)xAccount.Element("name");
                    newAccount.accountNumber = (string)xAccount.Element("accountNumber");
                    newAccount.balance = (decimal)xAccount.Element("balance");
                }
            }
        }
    }
    public class Client
    {
        public static List<Client> clients = new List<Client>();
        public string name { get; set; }
        public string ssid { get; set; }
        public string pswd { get; set; }
        public List<Account> accounts = new List<Account>();
    }
    public class Account
    {
        public string name { get; set; }
        public string accountNumber { get; set; }
        public decimal balance { get; set; }
    }
    public class SavingsAccount : Account 
    {
    }
    public class RegularAccount : Account
    {
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
foreach(文档子体中的XElement客户端(“客户端”))
{
Client newClient=newClient();
Client.clients.Add(newClient);
newClient.name=(字符串)client.Element(“名称”);
newClient.ssid=(字符串)client.Element(“ssid”);
newClient.pswd=(字符串)client.Element(“pswd”);
列出xAccounts=client.Elements()。其中(x=>(x.Name.LocalName==“savingsAcc”)| |(x.Name.LocalName==“regularAcc”)。ToList();
foreach(xAccounts中的XElement xAccount)
{
账户newAccount=null;
开关(xAccount.Name.LocalName)
{
案例“savingsAcc”:
newAccount=new SavingsAccount();
打破
案例“regularAcc”:
newAccount=新的常规帐户();
打破
}
newClient.accounts.Add(newAccount);
newAccount.name=(字符串)xAccount.Element(“名称”);
newAccount.accountNumber=(字符串)xAccount.Element(“accountNumber”);
newAccount.balance=(十进制)xAccount.Element(“余额”);
}
}
}
}
公共类客户端
{
公共静态列表客户端=新列表();
公共字符串名称{get;set;}
公共字符串ssid{get;set;}
公共字符串pswd{get;set;}
公共列表帐户=新列表();
}
公共类帐户
{
公共字符串名称{get;set;}
公共字符串accountNumber{get;set;}
公共十进制余额{get;set;}
}
公共类SavingsAccount:帐户
{
}
公共类正规帐户:Account
{
}
}

谢谢您的回答!我确实找到了一个解决方案,使用client.ChildNodes[I].ChildNodes[j].InnerText可以正常工作,但这个解决方案看起来更好,我将使用这个解决方案。非常感谢你!