C# 如何从动态代码中使用的特定节点访问子节点?
因此,我想从特定节点获取节点列表。在本课程中,我正在编写一个程序,将银行复制为“最终”形式,并编写了一个XML文档,其中包含我银行的所有客户机。我已经为登录函数编写了代码,现在我想返回特定客户机的详细信息C# 如何从动态代码中使用的特定节点访问子节点?,c#,xml,C#,Xml,因此,我想从特定节点获取节点列表。在本课程中,我正在编写一个程序,将银行复制为“最终”形式,并编写了一个XML文档,其中包含我银行的所有客户机。我已经为登录函数编写了代码,现在我想返回特定客户机的详细信息 <clients> <client> <name>Victor Olin</name> <ssid>20000724</ssid> <pswd>stora
<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可以正常工作,但这个解决方案看起来更好,我将使用这个解决方案。非常感谢你!