Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/nginx/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算xml c中特定节点的子节点数#_C#_Xml - Fatal编程技术网

C# 计算xml c中特定节点的子节点数#

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

我有这个xml,我需要计算“User”中的所有帐户。我尝试了几种方法,但得到的只是xml中所有帐户的值。我需要像User[1]/Accounts这样的东西,并且只获取该用户的帐户

<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;}
}
}