Может показаться, что вы на самом деле не используете LINQ to XML. В этом случае у вас есть XML-сериализуемый набор классов, сгенерированный XSD.exe, и LINQ to Objects запрашивает эти классы. Сериализуемые классы используют старые классы XML (XmlDocument
, XmlElement
и т. Д.) Вместо новых (XDocument
, XElement
и т. Д.).
Если вы заинтересованы в использовании чистого LINQ to XML, рассмотрите следующий учебник, который, я думаю, вы можете быстро адаптировать к вашим потребностям:
http://www.switchonthecode.com/tutorials/introduction-to-linq-simple-xml-parsing
ОБНОВЛЕНИЕ: решение без LINQ-to-XML
Я считаю, что непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что XSD.exe не сделал вывод, что вы предполагали, что элемент <Test>
должен содержать не более одного <Params>
элемента. Он обрабатывается так, как будто может быть массив из <Params>
элементов.
Тип ParamsRow
представляет отдельный элемент <Params>
; не отдельные <Param>
элементы. Я поставил бы красивый камень из сада, что у объекта ParamsRow
есть метод GetParamRows()
(обратите внимание на единственное число).
Другое обновление
Пример ниже выполняет ту же операцию, что и пример LINQ-to-XML. Он повторяет каждый тест и печатает тест вместе со своими параметрами. Для удобства я использую метод расширения SelectMany()
, который "сводит" результаты в единый набор ParamRow
объектов.
var myStruct = new MyStruct();
myStruct.ReadXml(@".\MyXml.xml", XmlReadMode.ReadSchema);
foreach (MyStruct.TestRow test in myStruct.Test)
{
Console.WriteLine("Test #" + test.Name);
foreach (var param in test.GetParamsRows().SelectMany(ps => ps.GetParamRows()))
{
Console.WriteLine("- {0}: {1}", param.Name, param.Param_Text);
}
}
Проверьте это и дайте мне знать, если это решит.
Следующий пример LINQ to XML перебирает каждый элемент Test и представляет его параметры на консоли. Обратите внимание, что в примере не используются классы, созданные с помощью XSD.exe, и для него не требуется или не используется схема.
var doc = XDocument.Load(@".\MyXml.xml");
foreach (var test in doc.Descendants("Test"))
{
Console.WriteLine("Test #" + test.Attribute("Name").Value);
foreach (var param in test.Descendants("Param"))
{
Console.WriteLine(
"- {0}: {1}",
param.Attribute("Name").Value,
param.Value);
}
}
Вывод выглядит так:
Test #Test1
- Param1: I am param1
- Param2: I am param2
Test #Test2
- Param1: I am param1
- Param2: I am param2