Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在LINQ2对象中获取我的内部元素?_C#_Xml_Xsd_Linq To Objects - Fatal编程技术网

C# 如何在LINQ2对象中获取我的内部元素?

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文件,我用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>
现在我可以检查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