Чтение XML в формат LINQ для проверки данных файла журнала. Условия в формате списка. linq не получает преобразованный XC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Чтение XML в формат LINQ для проверки данных файла журнала. Условия в формате списка. linq не получает преобразованный X

Сообщение Anonymous »

У меня есть проект, который считывает 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»