LINQ2OBJECTS:如何获得我的内在元素?

时间:2011-03-28 15:20:14

标签: 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</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个表中,我认为我需要对这些进行连接...即从测试到参数到参数...就像数据库一样?

任何确认,如果我在正确的方向,将非常感谢..

由于

1 个答案:

答案 0 :(得分:0)

看起来你实际上使用LINQ to XML。在这种情况下,您拥有的是由XSD.exe生成的XML可序列化类集,以及针对这些类的LINQ to Objects查询。可序列化类使用较旧的XML类(XmlDocumentXmlElement等)而不是新的类(XDocumentXElement等。)。

如果您对使用纯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