У меня есть проект, который считывает XML-файл ожидаемых результатов сборки для каждой области сборки и сравнивает ее с журналами сборки, чтобы определить, прошла ли сборка. Прямо сейчас linq показывает каждое условие в отдельной строке результатов, но (поскольку я просматриваю каждую строку результатов linq, чтобы проверить успешность) мне нужно иметь возможность проверять оба условия (если их два) в момент в одно и то же время, а не в разное время. В противном случае я мог бы проверять не ту строку файла журнала. Обратите внимание, что иногда существует два критерия успеха, но не всегда. Это всего лишь два условия, которые мне нужно проверить одновременно.
Чтобы внести это изменение, я переместил тег SuccessCriteria из тега «Условия» в раздел «Условия». Благодаря этому изменению linq не воспринимает строки XML. В моем полном XML-файле должно быть около 69 строк результатов_b, но он включает пару разделов, которые я не показываю, которые я оставил в старом формате. Я попытался изменить cName = (string)p.Attribute("name") на cName = (string)b.Attribute("name") в LINQ, но получил те же результаты. В то же время было изменено значение cValue.
Мой вопрос: как мне изменить LINQ, чтобы получить полный XML-файл, и groupBy_b, чтобы проверить оба условия одновременно? Я хочу объединить условия в список, но вокруг него иметь другие данные, такие как машина сборки, имя процесса и критерии успеха.
Например, таблица, которую я помещаю в xml, для некоторых журналов выглядит так: ParseISLogStats (поэтому мне нужно проверить правильность BuildProject и BaseBuildArea в журнале, поскольку это разные столбцы, но критерий успеха только один для этих двух условий):
ParseISLogStats Desctiption=nightly v17 partb Projects=8 Status=Success
ParseISLogStats Description=nightly v17 partb Projects=8 Status=Success
ParseISLogStats Description=nightly v17 Projects=33 Status=Success
Я рассматривал эти примеры:
linq
linq
На данный момент у меня есть этот код (с добавлением groupBy, чтобы попытаться объединить условия в список):
void ReadXml()
{
int i_results = 0; //0 is successful for all; if it increases we have failed in one
XmlDocument xml = new XmlDocument();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string newPath = Path.GetFullPath(Path.Combine(path, @"..\.."));
string finalPathXmlb = Path.GetFullPath(Path.Combine(newPath, @"BuildVerificationBuildAttributes_b.xml")); //new format
teamPost = "";
//linq
XDocument xmlDoc2 = XDocument.Load(finalPathXmlb);
//XElement buildVerificationElement = xmlDoc1.Element("BuildVerification");
//IEnumerable buildElements = buildVerificationElement.Elements("build");
//IEnumerable buildMachines = buildElements.Elements("BuildMachine");
//get just the times from the xml
//var codeFreezeTime = xmlDoc1.Descendants("codeFreezeTime").First()?.Value;
//logToFileAndScreen(codeFreezeTime);
//get build info from xml, such as process (log name), condition, successCriteria, build machine, start time header,
IEnumerable processes = buildMachines.Elements("Process");
var results_b =
xmlDoc2.Descendants("build")
.SelectMany(b => b.Descendants("Process")
.SelectMany(p => p.Descendants("Condition")
.SelectMany(c => c.Descendants("SuccessCriteria")
.Select(sc => new
{
buildMach = (string)b.Element("BuildMachine"),
p1 = (string)p.Element("ProcessName"),
startTimeHeader = (string)p.Element("startTimeHeader"),
cName = (string)c.Attribute("name"),
cValue = (string)c.Attribute("value"),
f1 = (string)sc.Element("field"),
c1 = (string)sc.Element("comparison"),
v1 = (string)sc.Element("value")
})))).ToList();
var groups_b = results_b.GroupBy(x => new { build_machine = x.buildMach, process_name = x.p1, name = x.cName }).ToList();
} //ParseLogFile
Я хочу, чтобы мои groups_b выглядели так (но если linq не работает, он никогда этого не сделает, но я не думаю, что у меня это правильно в моих groups_b, если бы linq это сделал работа):
{buildMach = mach64, p1=ParseISLogStats, startTimeHeader = StartTime, {cName=Description, cValue=nightly v17 partb, cName=Projects, cValue=8}, f1=Status, c1=equal, v1=Succcess}
{buildmach = mach64, p1=ParseISLogStats, startTimeheader = StartTime, {cName=Description, cValue = nightly v17, cName=Projects, cValue=33},f1=status, c1=equal, v1=Success}
Вот как выглядит мой XML:
19:00
mach31
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
mach46
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
Status
equal
Success
SpinFileVersionStats
StartTime
< b r / > & l t ; / C o n d i t i o n & g t ; < b r / > & l t ; / C o n d i t i o n s & g t ; < b r / > & l t ; S u c c e s s C r i t e r i a & g t ; < b r / > & l t ; f i e l d & g t ; S t a t u s & l t ; / f i e l d & g t ; < b r / > & l t ; c o m p a r i s o n & g t ; e q u a l & l t ; / c o m p a r i s o n & g t ; < b r / > & l t ; v a l u e & g t ; S u c c e s s & l t ; / v a l u e & g t ; < b r / > & l t ; / S u c c e s s C r i t e r i a & g t ; < b r / > & l t ; / P r o c e s s & g t ; < b r / > & l t ; P r o c e s s & g t ; < b r / > & l t ;ProcessName>SpinFileVersionStats
StartTime
Status
equal
Success
SpinISProjectVersionStats
StartTime
Status
equal
Success
SpinISProjectVersionStats
StartTime
Status
equal
Success
SpinISProjectVersionStats
StartTime
Status
equal
Success
GetSWStats
StartTime
Status
equal
Successful
ParseISLogStats
StartTime
Status
equal
Success
ParseISLogStats
StartTime
Status
equal
Success
ParseISLogStats
StartTime
Status
equal
Success
ParseISLogStats
StartTime
Status
equal
Success
Обновление:
Я попробовал изменить LINQ на следующее, но он по-прежнему просто возвращает данные из XML-файла, который я оставил в старом формате, а не из того, у которого есть SuccessCriteria в того же уровня/глубины, что и Условия.
var results_b = (
from b in xmlDoc2.Descendants("build")
from p in b.Descendants("Process")
from c in p.Descendants("Condition")
from sc in c.Descendants("SuccessCriteria")
select new
{
buildMach = (string)b.Element("BuildMachine"),
p1 = (string)p.Element("ProcessName"),
startTimeHeader = (string)p.Element("startTimeHeader"),
cName = (string)c.Attribute("name"),
cValue = (string)c.Attribute("value"),
f1 = (string)sc.Element("field"),
c1 = (string)sc.Element("comparison"),
v1 = (string)sc.Element("value")
})
.ToList();
Подробнее здесь: https://stackoverflow.com/questions/784 ... ns-in-list
Чтение XML в формат LINQ для проверки данных файла журнала. Условия в формате списка. linq не получает преобразованный X ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Временно изменить формат журнала в библиотеке Python (неизвестный контекст журнала)
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Временно изменить формат журнала в библиотеке Python (неизвестный контекст журнала)
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Временно изменить формат журнала в библиотеке Python (неизвестный контекст журнала)
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-