C# 如何在LINQ2对象中获取我的内部元素?
这里有一个简单的XML文件,我用XSD.exe将其转换为XSD,然后在XSD.exe上用/C转换为强类型类C# 如何在LINQ2对象中获取我的内部元素?,c#,xml,xsd,linq-to-objects,C#,Xml,Xsd,Linq To Objects,这里有一个简单的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&l
<?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>
现在我可以检查myStruct的属性了,我可以看到Params和Test。太好了
现在我使用一个简单的链接查询来实现这一点
var tests = from s in myStruct.Test select s;
当然,我可以看到Test1和Test2。现在请理解Test1和Test2中有参数。我注意到我能做到
GetParamsRows();
然后我可以对它做一个foreach,每个元素都是ParamsRow。什么是回报?我似乎看不到“我是param1”或“我是param2”
我需要内部连接还是什么
我想拿起一个测试里面有一个集合或参数,所以我应该能够看到它
编辑
现在我注意到在Test中有一个Test_id,在Params中有一个Params_id和一个Test_id
关系属性似乎已设置,但我是否必须创建连接手册
测验
我注意到一个名为Tables的属性,在我的3个表中,我假设我需要对这些表进行连接,即从test到params再到param。像数据库
我说的对吗?看起来您实际上没有使用LINQ to XML。在本例中,您拥有的是由XSD.exe生成的一组XML可序列化类,以及针对这些类的LINQ to Objects查询。可序列化类使用旧的XML类(
XmlDocument
,xmlement
等),而不是新的类(XDocument
,XElement
等)
如果你有兴趣使用纯LINQ到XML,考虑一下下面的教程,我认为你可以很快地适应你的需求:
更新:非LINQ到XML解决方案 我认为您面临的直接问题是XSD.exe没有推断出您希望
元素最多包含一个
元素。它被视为可能存在一个
元素数组
ParamsRow
类型表示单个
元素;不是单个的
元素。我敢打赌,ParamsRow
对象有一个getparamrrows()
方法(注意单数)
另一次更新
下面的示例执行与LINQ到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);
}
}
检查一下,如果问题解决了,请告诉我
下面的LINQtoXML示例迭代每个测试元素,并在控制台上显示其参数。请注意,该示例不使用用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
是的,实际上我正在使用LINQ2对象,因为我将XML(XSD)转换为强类型类。很抱歉,我应该更新这个问题。我花了一点时间编写了一个函数代码示例。我终于意识到您使用了/dataset开关而不是/classes开关。无论如何,我的回复中添加了一个工作代码示例。干杯不,我使用了classes开关/c---根据这个/c[lasses]生成与指定模式对应的类。要将XML数据读入对象,请使用System.XML.Serialization.XmlSerializer.Deserializer方法。
Test #Test1
- Param1: I am param1
- Param2: I am param2
Test #Test2
- Param1: I am param1
- Param2: I am param2