C# 获取C中父元素中元素的最后一个xml子代#

C# 获取C中父元素中元素的最后一个xml子代#,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我试图获取scheme元素中数据元素的最后一个子元素的计数,并根据该计数向数据元素添加一个元素。这是我的密码 [...] if ((scheme.Descendants("data").Count() > 1 ) && (serialNumber == scheme.Descendants("data").Count())) { data.Add(new XElement("serial-no", "T9999")); } else { data

我试图获取scheme元素中数据元素的最后一个子元素的计数,并根据该计数向数据元素添加一个元素。这是我的密码

 [...]
 if ((scheme.Descendants("data").Count() > 1 ) && (serialNumber == scheme.Descendants("data").Count()))
 {
    data.Add(new XElement("serial-no", "T9999"));
 }
 else
 {
    data.Add(new XElement("serial-no", serialNumber));
 }
 [...]
序列号是自动递增的。 产量不好,因为这是我得到的

 <scheme>
  <code>10050</code>
  <data>
    <serial-no>1</serial-no>
  </data>
  <data>
    <serial-no>T9999</serial-no>
  </data>
  <data>
    <serial-no>T9999</serial-no>
  </data>
</scheme>
下面是我想要的

 <scheme>
  <code>10050</code>
  <data>
    <serial-no>1</serial-no>
  </data>
  <data>
    <serial-no>2</serial-no>
  </data>
  [...]
  <data>
    <serial-no>T9999</serial-no>
  </data>
</scheme>
 <scheme>
  <code>10000</code>
  <data>
    <serial-no>1</serial-no>
  </data>
  <data>
    <serial-no>2</serial-no>
  </data>
  [...]
  <data>
    <serial-no>T9999</serial-no>
  </data>
</scheme>
我需要做什么?

使用以下命令:

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

namespace ConsoleApplication1
{
    class Program
    {

        const string INPUT_FILENAME = @"c:\temp\test.txt";
        const string OUTPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME1 = @"c:\temp\test1.xml";
        static DataTable dt = new DataTable();
        static XDocument doc;

        static void Main(string[] args)
        {
            ReadData(INPUT_FILENAME);
            dt = dt.AsEnumerable()
                .OrderBy(x => x.Field<string>("scheme-code"))
                .ThenBy(x => x.Field<string>("emp-code"))
                .ThenBy(x => x.Field<string>("pin"))
                .CopyToDataTable();

            CreateXml();
            doc.Save(OUTPUT_FILENAME);

            XElement t9999 = null;
            XElement newData = null;
            //add new node
            foreach (XElement scheme in doc.Descendants("scheme"))
            {
                //foreach (XElement employer in scheme.Descendants("employer"))
                //{
                t9999 = scheme.Elements("data").Where(x => (string)x.Element("serial-no") == "T9999").FirstOrDefault();
                int maxSerialNumber = scheme.Descendants("serial-no").Where(x => (string)x != "T9999").Max(x => (int)x);

                string serialNumberStr = (t9999 == null) ? "T9999" : (maxSerialNumber + 1).ToString();

                if (t9999 == null)
                {
                    t9999 = NewData(
                         "T9999",
                         "",  //pin
                         0.0M,  //emplorer contribution
                         0.0M,  //employee contribution
                         0.0M, //total volumn contribution
                         0.0M  // total
                     );

                    scheme.Add(newData);
                }
                else
                {
                    newData = NewData(
                        (maxSerialNumber + 1).ToString(),
                        "",  //pin
                        0.0M,  //emplorer contribution
                        0.0M,  //employee contribution
                        0.0M, //total volumn contribution
                        0.0M  // total
                    );

                    t9999.ReplaceWith(new object[] { newData, t9999 });
                }
                //}

            }

            doc.Save(OUTPUT_FILENAME1);

        }
        static void ReadData(string filename)
        {
            int rowNumber = 0;
            string line = "";
            StreamReader reader = new StreamReader(INPUT_FILENAME);

            while ((line = reader.ReadLine()) != null)
            {
                string[] splitData = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray();

                if (++rowNumber == 1)
                {
                    for (int i = 0; i < splitData.Length; i++)
                    {
                        if (i < 3)
                        {
                            dt.Columns.Add(splitData[i], typeof(string));
                        }
                        else
                        {
                            dt.Columns.Add(splitData[i], typeof(decimal));
                        }
                    }
                }
                else
                {
                    DataRow newRow = dt.Rows.Add();
                    for (int i = 0; i < splitData.Length; i++)
                    {
                        if (i < 3)
                        {
                            newRow[i] = splitData[i];
                        }
                        else
                        {
                            newRow[i] = decimal.Parse(splitData[i]);
                        }
                    }
                }
            }
            reader.Close();
        }
        static void CreateXml()
        {
            string xmlns_rmas = "value here";
            string xmlns_xsi = "value here";
            string xmlns_noNamespaceSchemaLocation = "value here";
            string xmlIdentFormat =
                "<?xml version='1.0' encoding='UTF-8'?>" +
                "<return" +
                    " xmlns:rmas=\"{0}\"" +
                    " xmlns:xsi=\"{1}\"" +
                    " xsi:noNamespaceSchemaLocation=\"{2}\">" +
                "</return>";
            string xmlIdent = string.Format(xmlIdentFormat, xmlns_rmas, xmlns_xsi, xmlns_noNamespaceSchemaLocation);
            doc = XDocument.Parse(xmlIdent);

            XElement _return = doc.Root;

            string returnCode = "";
            string returnDesc = "";
            DateTime date = DateTime.Now;
            string operatorCode = "";
            XElement header = new XElement("header", new object[] {
                new XElement("return-code", returnCode),
                new XElement("return-desc", returnDesc),
                new XElement("as-at-date", date),
                new XElement("operator-code", operatorCode)
            });
            _return.Add(header);

            XElement body = new XElement("body");
            _return.Add(body);


            foreach (var schemeGroup in dt.AsEnumerable().GroupBy(x => x.Field<string>("scheme-code")))
            {
                XElement scheme = new XElement("scheme");
                body.Add(scheme);
                XElement code = new XElement("code", schemeGroup.Key);
                scheme.Add(code);
                foreach (var empCodeGroup in schemeGroup.GroupBy(y => y.Field<string>("emp-code")))
                {
                    //XElement employer = new XElement("employer");
                    //scheme.Add(employer);
                    int serialNumber = 0;

                    foreach (var pinGroup in empCodeGroup.GroupBy(y => y.Field<string>("pin")))
                    {
                        if (serialNumber == 0)
                        {
                            XElement emprCode = new XElement("empr-code", empCodeGroup.Key);
                            scheme.Add(emprCode);
                        }
                        foreach (DataRow row in pinGroup)
                        {
                            string serialNumberStr = serialNumber.ToString();

                            if ((empCodeGroup.Count() > 1) && (serialNumber == empCodeGroup.Count() - 1))
                            {
                                serialNumberStr = "T9999";
                            }


                            XElement data = NewData(
                                serialNumberStr,
                                pinGroup.Key,
                                row.Field<decimal>("empr-contr"),
                                row.Field<decimal>("empyee-contr"),
                                row.Field<decimal>("total-vol-cont"),
                                 row.Field<decimal>("total")
                            );
                            scheme.Add(data);
                            serialNumber++;
                        }

                    }
                }
            }
        }
        static XElement NewData(string serialNumber, string pin, decimal employerContribution, decimal employeeContribution, decimal voluntaryContribution, decimal totalContribution)
        {
            XElement data = new XElement("data");
            data.Add(new XElement("serial-no", serialNumber));
            data.Add(new XElement("pin", pin));
            data.Add(new XElement("employer-contribution", employerContribution));
            data.Add(new XElement("employee-contribution", employeeContribution));
            data.Add(new XElement("voluntary-contribution", voluntaryContribution));
            data.Add(new XElement("total-contribution", totalContribution));

            return data;
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用系统数据;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串输入\u文件名=@“c:\temp\test.txt”;
常量字符串输出\u文件名=@“c:\temp\test.xml”;
常量字符串输出\u FILENAME1=@“c:\temp\test1.xml”;
静态数据表dt=新数据表();
静态XDocument文档;
静态void Main(字符串[]参数)
{
读取数据(输入文件名);
dt=dt.AsEnumerable()
.OrderBy(x=>x.Field(“方案代码”))
.ThenBy(x=>x.Field(“emp代码”))
.ThenBy(x=>x.Field(“pin”))
.CopyToDataTable();
CreateXml();
文件保存(输出文件名);
XElement t9999=null;
XElement newData=null;
//添加新节点
foreach(文档子体中的元素方案(“方案”))
{
//foreach(方案中的雇主(“雇主”))
//{
t9999=scheme.Elements(“数据”)。其中(x=>(字符串)x.Element(“序列号”)==“t9999”)。FirstOrDefault();
int maxSerialNumber=scheme.substands(“序列号”)。其中(x=>(字符串)x!=“T9999”)。Max(x=>(int)x);
字符串serialNumberStr=(t9999==null)?“t9999”:(maxSerialNumber+1).ToString();
如果(t9999==null)
{
t9999=新数据(
“T9999”,
“”,//pin
0.0M,//雇主贡献
0.0M,//员工供款
0.0M,//总体积贡献
0.0米//总计
);
方案。添加(新数据);
}
其他的
{
newData=newData(
(maxSerialNumber+1).ToString(),
“”,//pin
0.0M,//雇主贡献
0.0M,//员工供款
0.0M,//总体积贡献
0.0米//总计
);
ReplaceWith(新对象[]{newData,t9999});
}
//}
}
单据保存(输出文件名1);
}
静态void ReadData(字符串文件名)
{
int rowNumber=0;
字符串行=”;
StreamReader=新的StreamReader(输入文件名);
而((line=reader.ReadLine())!=null)
{
string[]splitData=line.Split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries.ToArray();
如果(++rowNumber==1)
{
对于(int i=0;ix.Field(“方案代码”))
{
XElement方案=新XElement(“方案”);
主体。添加(方案);
XElement代码=新XElement(“代码”,schemeGroup.Key);
方案.增加(代码);
foreach(schemeGroup.GroupBy中的var empCodeGroup(y=>y.Field(“emp代码”))
{
//XElement雇主=新XElement(“雇主”);
//方案.增加(雇主);