C# 计算xml c中特定节点的子节点数#
我有这个xml,我需要计算“User”中的所有帐户。我尝试了几种方法,但得到的只是xml中所有帐户的值。我需要像User[1]/Accounts这样的东西,并且只获取该用户的帐户C# 计算xml c中特定节点的子节点数#,c#,xml,C#,Xml,我有这个xml,我需要计算“User”中的所有帐户。我尝试了几种方法,但得到的只是xml中所有帐户的值。我需要像User[1]/Accounts这样的东西,并且只获取该用户的帐户 <UserList> <User> <Username>hello</Username> <Pin>640</Pin> <Accounts> <AccountName>Dolar</AccountN
<UserList>
<User>
<Username>hello</Username>
<Pin>640</Pin>
<Accounts>
<AccountName>Dolar</AccountName>
<Balance>150</Balance>
<MaxWithdrawAmount>1200</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
<Accounts>
<AccountName>RON</AccountName>
<Balance>650</Balance>
<MaxWithdrawAmount>5000</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
</User>
<User>
<Username>Kevin</Username>
<Pin>1234</Pin>
<Accounts>
<AccountName>RON</AccountName>
<Balance>650</Balance>
<MaxWithdrawAmount>5000</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
<Accounts>
<AccountName>Lei</AccountName>
<Balance>950</Balance>
<MaxWithdrawAmount>1200</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
</User>
</UserList>
你好
640
多拉
150
1200
2000
罗恩
650
5000
2000
凯文
1234
罗恩
650
5000
2000
雷
950
1200
2000
因此,我的输出应该是:
对于用户1,您有2个帐户
“对于用户x,您有x个帐户”这里有一种方法可以做到这一点。
请阅读代码中的注释
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
string XML_String = @"<UserList>
<User>
<Username>hello</Username>
<Pin>640</Pin>
<Accounts>
<AccountName>Dolar</AccountName>
<Balance>150</Balance>
<MaxWithdrawAmount>1200</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
<Accounts>
<AccountName>RON</AccountName>
<Balance>650</Balance>
<MaxWithdrawAmount>5000</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
</User>
<User>
<Username>Kevin</Username>
<Pin>1234</Pin>
<Accounts>
<AccountName>RON</AccountName>
<Balance>650</Balance>
<MaxWithdrawAmount>5000</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
<Accounts>
<AccountName>Lei</AccountName>
<Balance>950</Balance>
<MaxWithdrawAmount>1200</MaxWithdrawAmount>
<MaxDepositAmount>2000</MaxDepositAmount>
</Accounts>
</User>
</UserList>";
var users = GetUsers(XML_String);
// show in console
foreach (MyUser usr in users)
{
Console.WriteLine(usr);
}
Console.ReadLine();
}
private static List<MyUser> GetUsers(string xmlstring)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlstring);
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("User");
// List to hold data
List<MyUser> MyUsersList = new List<MyUser>();
// Couter for the UserOrderNumber by his order in the document
int userOrderCounter = 0;
// Counter for number of accounts
int accountCounter = 0;
// itterate trough all <User> nodes
foreach (XmlNode node in nodes)
{
accountCounter = 0;
userOrderCounter++;
// create user object
MyUser usr = new MyUser();
// Itterate trough all child nodes
for (int i = 0; i < node.ChildNodes.Count; i++)
{
if (node.ChildNodes[i].Name == "Username")
{
usr.Username = node.ChildNodes[i].InnerXml;
}
else if (node.ChildNodes[i].Name == "Pin")
{
usr.Pin = Convert.ToInt32(node.ChildNodes[i].InnerXml);
}
else if (node.ChildNodes[i].Name == "Accounts")
{
accountCounter++;
}
}
// Add the counters values
usr.UserOrderNumber = userOrderCounter;
usr.NumberOfAccountes = accountCounter;
// Add to list
MyUsersList.Add(usr);
}
return MyUsersList;
}
}
/// <summary>
/// class to hold users retrived from XML document
/// </summary>
class MyUser
{
public int UserOrderNumber { get; set; }
public string Username { get; set; }
public int Pin { get; set; }
public int NumberOfAccountes { get; set; }
public override string ToString()
{
return return "User " + UserOrderNumber.ToString() + " (Name " + Username + ")" + " Have " + NumberOfAccountes.ToString() + " Accounts";
}
}
}
名称空间控制台ap3
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串XML_字符串=@“
你好
640
多拉
150
1200
2000
罗恩
650
5000
2000
凯文
1234
罗恩
650
5000
2000
雷
950
1200
2000
";
var users=GetUsers(XML\u字符串);
//在控制台中显示
foreach(用户中的MyUser usr)
{
控制台写入线(usr);
}
Console.ReadLine();
}
私有静态列表GetUsers(字符串xmlstring)
{
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlstring);
XmlElement根=doc.DocumentElement;
XmlNodeList nodes=root.SelectNodes(“用户”);
//保存数据的列表
List MyUsersList=新列表();
//按其在文档中的顺序查找UserOrderNumber
int userOrderCounter=0;
//帐号计数器
int accountCounter=0;
//通过所有节点进行通信
foreach(节点中的XmlNode节点)
{
accountCounter=0;
userOrderCounter++;
//创建用户对象
MyUser usr=新的MyUser();
//通过所有子节点进行初始化
对于(int i=0;i
输出:
用户1(名称hello)有2个帐户用户2(姓名Kevin)有2个帐户这可以使用LINQ to XML()完成 你可以在下面找到一只鹬:
var xmlDoc = XDocument.Parse(xml);
var userNumber = 0;
foreach (var user in xmlDoc.Element("UserList").Elements("User"))
{
userNumber++;
var accounts = user.Elements("Accounts").Count();
Console.WriteLine($"For User {userNumber}, you have {accounts} Accounts");
}
不要忘记添加所需的用法:
using System.Linq;
using System.Xml.Linq;
如果使用.Net Core或.Net Framework的System.Xml.XDocument.dll,要添加对System.Xml.XDocument.dll的引用,我喜欢将字典与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 FILENANE = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENANE);
Dictionary<string, User> dict = doc.Descendants("User").Select(x => new User()
{
username = (string)x.Element("Username"),
pin = (int)x.Element("Pin"),
accounts = x.Elements("Accounts").ToList()
}).GroupBy(x => x.username, y => y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
foreach (var user in dict)
{
Console.WriteLine("User : {0}, Count = {1}", user.Key, user.Value.accounts.Count());
}
Console.ReadLine();
}
}
public class User
{
public string username { get; set; }
public int pin { get; set; }
public List<XElement> accounts { get; set; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
常量字符串FILENANE=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(FILENANE);
Dictionary dict=doc.subscriptions(“用户”)。选择(x=>newuser()
{
用户名=(字符串)x.Element(“用户名”),
pin=(int)x.Element(“pin”),
accounts=x.Elements(“accounts”).ToList()
}).GroupBy(x=>x.username,y=>y)
.ToDictionary(x=>x.Key,y=>y.FirstOrDefault());
foreach(dict中的var用户)
{
WriteLine(“User:{0},Count={1}”,User.Key,User.Value.accounts.Count());
}
Console.ReadLine();
}
}
公共类用户
{
公共字符串用户名{get;set;}
公共int pin{get;set;}
公共列表帐户{get;set;}
}
}