C#通過類序列化寫入XML時,下邊是分析資料保存出來的xml。
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Versions>
<Version>
<Ver_Name>V2.0</Ver_Name>
<PassNumber>6</PassNumber>
<FailNumber>3</FailNumber>
<CountNumber>9</CountNumber>
<Modules>
<Module>
<Name>Tuner</Name>
<ModuleCount>6</ModuleCount>
<PassNumber>4</PassNumber>
<FailNumber>2</FailNumber>
</Module>
<Module>
<Name>Media</Name>
<ModuleCount>3</ModuleCount>
<PassNumber>2</PassNumber>
<FailNumber>1</FailNumber>
</Module>
</Modules>
</Version>
<Version>
<Ver_Name>V2.0</Ver_Name>
<PassNumber>4</PassNumber>
<FailNumber>2</FailNumber>
<CountNumber>6</CountNumber>
<Modules>
<Module>
<Name>Tuner</Name>
<ModuleCount>6</ModuleCount>
<PassNumber>4</PassNumber>
<FailNumber>2</FailNumber>
</Module>
</Modules>
</Version>
</Versions>
</Data>
目標:如何把Ver_Name相同的資料合并整合為以下格式。
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Versions>
<Version>
<Ver_Name>V2.0</Ver_Name>
<PassNumber>10</PassNumber>
<FailNumber>5</FailNumber>
<CountNumber>15</CountNumber>
<Modules>
<Module>
<Name>Tuner</Name>
<ModuleCount>12</ModuleCount>
<PassNumber>8</PassNumber>
<FailNumber>4</FailNumber>
</Module>
<Module>
<Name>Media</Name>
<ModuleCount>3</ModuleCount>
<PassNumber>2</PassNumber>
<FailNumber>1</FailNumber>
</Module>
</Modules>
</Version>
</Versions>
</Data>
生成xml的類結構:
public class Data
{
private List<Version> _Versions;
public List<Version> Versions
{
get { return _Versions; }
set { _Versions = value; }
}
}
public class Version
{
private string _Ver_Name;
public string Ver_Name
{
get { return _Ver_Name; }
set { _Ver_Name = value; }
}
private int _PassNumber;
public int PassNumber
{
get { return _PassNumber; }
set { _PassNumber = value; }
}
private int _FailNumber;
public int FailNumber
{
get { return _FailNumber; }
set { _FailNumber = value; }
}
private int _CountNumber;
public int CountNumber
{
get { return _CountNumber; }
set { _CountNumber = value; }
}
private List<Module> _Modules;
public List<Module> Modules
{
get { return _Modules; }
set { _Modules = value; }
}
}
public class Module
{
private string _name = string.Empty;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _moduleCount = 0;
public int ModuleCount
{
get { return _moduleCount; }
set { _moduleCount = value; }
}
private int _passNumber;
public int PassNumber
{
get { return _passNumber; }
set { _passNumber = value; }
}
private int _failNumber;
public int FailNumber
{
get { return _failNumber; }
set { _failNumber = value; }
}
}
uj5u.com熱心網友回復:
XDocument xdocument = XDocument.Load("data.xml");
var result = (from x in xdocument.Root.Elements("Versions").Elements("Version")
select new Version
{
Ver_Name = x.Element("Ver_Name").Value,
PassNumber = x.Element("PassNumber").Value,
FailNumber = x.Element("FailNumber").Value,
CountNumber = x.Element("CountNumber").Value,
Modules = (from m in x.Elements("Modules").Elements("Module")
select new Module
{
Name = m.Element("Name").Value,
ModuleCount = m.Element("ModuleCount").Value,
PassNumber = m.Element("PassNumber").Value,
FailNumber = m.Element("FailNumber").Value,
}).ToList()
}).ToList();
var temp = from t in result
group t by t.Ver_Name into g
select new
{
Ver_Name = g.Key,
PassNumber = g.Sum(p => (int.Parse(p.PassNumber))),
FailNumber = g.Sum(p => (int.Parse(p.FailNumber))),
CountNumber = g.Sum(p => (int.Parse(p.CountNumber))),
Modules = from x in g.Select(k => k.Modules) select x
};
List<NewVersion> versions = new List<NewVersion>();
foreach (var item in temp)
{
NewVersion version = new NewVersion();
version.Ver_Name = item.Ver_Name;
version.PassNumber = item.PassNumber;
version.FailNumber = item.FailNumber;
version.CountNumber = item.CountNumber;
foreach (var m in item.Modules)
{
if (version.Modules is null)
{
version.Modules = new List<NewModule>();
}
foreach (var x in m)
{
NewModule module = new NewModule() { Name = x.Name, FailNumber = int.Parse(x.FailNumber), PassNumber = int.Parse(x.PassNumber), ModuleCount = int.Parse(x.ModuleCount) };
version.Modules.Add(module);
}
}
versions.Add(version);
}
foreach (var item in versions)
{
var test = from x in item.Modules
group x by x.Name into g
select new NewModule
{
Name = g.Key,
FailNumber = g.Sum(f => f.FailNumber),
PassNumber = g.Sum(p => p.PassNumber),
ModuleCount = g.Sum(m => m.ModuleCount)
};
item.Modules = test.ToList();
}
XElement root = new XElement("Data", new XElement("Versions", from x in versions
select new XElement("Version", new XElement("Ver_Name", x.Ver_Name), new XElement("PassNumber", x.PassNumber), new XElement("FailNumber", x.FailNumber), new XElement("CountNumber", x.CountNumber), new XElement("Modules", from y in x.Modules select new XElement("Module", new XElement("Name", y.Name), new XElement("FailNumber", y.FailNumber), new XElement("PassNumber", y.PassNumber), new XElement("ModuleCount", y.ModuleCount))))));
root.Save(String.Format("{0}\\test.xml", Environment.CurrentDirectory));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/32849.html
標籤:C#
上一篇:VS2015,DevExpress18.1 剛運行就報錯,請問如何解決?
下一篇:VS2017運行卡頓,求解決方案
