我在这里有一个简单的XML文件,我用xsd.exe转换为XSD,然后在xsd.exe上使用/ C转换为强类型类
<?xml version="1.0" encoding="utf-8" ?>
<MyStruct>
<Test Name="Test1">
<Params>
<Param Name="Param1">I am param1</Param>
<Param Name="Param2">I am param2</Param>
</Params>
</Test>
<Test Name="Test2">
<Params>
<Param Name="Param1">I am param1</Param>
<Param Name="Param2">I am param2</Param>
</Params>
</Test>
</MyStruct>
现在我读了这样的XML
myStruct.ReadXml(file, XmlReadMode.ReadSchema);
现在我可以检查myStruct的属性,我可以看到Params和Test。太好了!
现在使用简单的链接查询我这样做
var tests = from s in myStruct.Test select s;
确定我可以看到Test1和Test2。现在了解Test1和Test2里面有Params。我注意到我可以做到
GetParamsRows();
然后我可以对它做一个foreach,每个元素都是ParamsRow。什么是回报,我似乎无法看到“我是param1”或“我是param2”
我需要内部联接吗?
我认为拿起测试有一个集合或Params里面所以我应该能够看到它。
我真的很困惑,
任何帮助真的很感激
修改
现在我注意到的是,在Test中有一个test_id,在Params中有一个Params_id和一个Test_id。
看来关系属性已设置但是我必须创建JOINS手册..任何帮助真的很感激
TEST
我注意到一个名为Tables的属性,并且在我的3个表中,我认为我需要对这些进行连接...即从测试到参数到参数...就像数据库一样?
任何确认,如果我在正确的方向,将非常感谢..
由于
答案 0 :(得分:0)
看起来你实际上不使用LINQ to XML。在这种情况下,您拥有的是由XSD.exe生成的XML可序列化类集,以及针对这些类的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