Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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/1/amazon-web-services/14.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# 使用LINQ读取xml并存储在对象列表中_C#_Xml_Linq - Fatal编程技术网

C# 使用LINQ读取xml并存储在对象列表中

C# 使用LINQ读取xml并存储在对象列表中,c#,xml,linq,C#,Xml,Linq,我有以下格式的xml文件: <TestDataFile name="Register"> <TestSuite name="Positive"> <TestCase> <StoryName>Register user</StoryName> <ScenarioName>Positive</ScenarioName> <TestCaseName>Register new user</T

我有以下格式的xml文件:

<TestDataFile name="Register">
<TestSuite name="Positive">
<TestCase>
  <StoryName>Register user</StoryName>
  <ScenarioName>Positive</ScenarioName>
  <TestCaseName>Register new user</TestCaseName>
  <ResponseCode>200</ResponseCode>
  <UserDetails>
    <DateOfBirth></DateOfBirth>
  </UserDetails>
</TestCase>
<TestCase>
  <StoryName>Register user</StoryName>
  <ScenarioName>Positive</ScenarioName>
  <TestCaseName>Register new user</TestCaseName>
  <ResponseCode>200</ResponseCode>
  <UserDetails>
    <DateOfBirth></DateOfBirth>
  </UserDetails>
 </TestCase>
 </TestSuite>
 <TestSuite name="Negative">
 <TestCase>
  <StoryName>Register user</StoryName>
  <ScenarioName>Positive</ScenarioName>
  <TestCaseName>Register new user</TestCaseName>
  <ResponseCode>200</ResponseCode>
  <UserDetails>
    <DateOfBirth></DateOfBirth>
  </UserDetails>
  </TestCase>
 <TestCase>
  <StoryName>Register user</StoryName>
  <ScenarioName>Positive</ScenarioName>
  <TestCaseName>Register new user</TestCaseName>
  <ResponseCode>200</ResponseCode>
  <UserDetails>
    <DateOfBirth></DateOfBirth>
  </UserDetails>
  </TestCase>
  </TestSuite>
 </TestDataFile>

注册用户
肯定的
注册新用户
200
注册用户
肯定的
注册新用户
200
注册用户
肯定的
注册新用户
200
注册用户
肯定的
注册新用户
200
有许多这种格式的xml文件。我想读取所有XML并存储在一个列表中:使用LINQ的列表。尝试使用以下代码实现,但不起作用:

foreach (string file in files)
        {
            TestDataFile testData = new TestDataFile();
            var doc = XDocument.Load(file);
            var result = doc.Descendants("TestDataFile")
                .Select(x => new TestDataFile
                {
                    TestSuites = new List<TestSuite>
                    (from ts in doc.Descendants("TestSuite")
                     select new TestSuite
                     {
                         TestCases = new List<TestCase>(from test in doc.Descendants("TestCase")
                                                        select new TestCase
                                                        {
                                                            StoryName = x.Element("StoryName").Value
                                                        })
                     })
                });

        }
foreach(文件中的字符串文件)
{
TestDataFile testData=新的TestDataFile();
var doc=XDocument.Load(文件);
var result=doc.substands(“TestDataFile”)
.Select(x=>newtestdatafile
{
TestSuites=新列表
(来自文档子体中的ts(“TestSuite”)
选择新的测试套件
{
TestCases=新列表(来自文档子体(“TestCase”)中的测试)
选择新的测试用例
{
StoryName=x.Element(“StoryName”).Value
})
})
});
}

有人能帮我吗?

您可以使用以下代码对任何对象进行序列化和反序列化。 在您的例子中,TestDataFile的对象应该是obj。在TestDataFile内部,您应该声明TestSuite的属性,并在其中声明TestCase列表类型的属性

获取XML文件的代码如下:

 TextReader Treader = null;
 Treader = new StreamReader(fullFileName);
 ContactsModel = (ContactsDBModel)OSINFO.FromXml<ContactsDBModel>(Treader);
试试这个:-

var result = XDocument.Load(@"Path\Data.xml").Root.Descendants("TestCase")
                       .Select(x => new TestCase 
                       {
                           StoryName = x.Element("StoryName").Value,
                           ScenarioName = x.Element("ScenarioName").Value,
                           TestCaseName = x.Element("TestCaseName").Value,
                           ResponseCode = Convert.ToInt32(x.Element("ResponseCode").Value),
                           userDetails = x.Descendants("UserDetails")
                                          .Select(z => new UserDetail 
                                            { 
                                                 DateOfBirth = !String.IsNullOrEmpty(z.Element("DateOfBirth").Value) ?
                                                               Convert.ToDateTime(z.Element("DateOfBirth").Value) : DateTime.MinValue }).FirstOrDefault()
                                            }).ToList();
其中我使用了以下类型:-

public class TestCase
{
    public string StoryName { get; set; }
    public string ScenarioName { get; set; }
    public string TestCaseName { get; set; }
    public int ResponseCode { get; set; }
    public UserDetail userDetails { get; set; }
}

public class UserDetail
{
    public DateTime DateOfBirth { get; set; }
}
编辑:

我认为您的UserDetail不会是TestCase类型中的
列表,因此根据该假设更新了代码。

查看这篇文章:什么是不工作?
var result = XDocument.Load(@"Path\Data.xml").Root.Descendants("TestCase")
                       .Select(x => new TestCase 
                       {
                           StoryName = x.Element("StoryName").Value,
                           ScenarioName = x.Element("ScenarioName").Value,
                           TestCaseName = x.Element("TestCaseName").Value,
                           ResponseCode = Convert.ToInt32(x.Element("ResponseCode").Value),
                           userDetails = x.Descendants("UserDetails")
                                          .Select(z => new UserDetail 
                                            { 
                                                 DateOfBirth = !String.IsNullOrEmpty(z.Element("DateOfBirth").Value) ?
                                                               Convert.ToDateTime(z.Element("DateOfBirth").Value) : DateTime.MinValue }).FirstOrDefault()
                                            }).ToList();
public class TestCase
{
    public string StoryName { get; set; }
    public string ScenarioName { get; set; }
    public string TestCaseName { get; set; }
    public int ResponseCode { get; set; }
    public UserDetail userDetails { get; set; }
}

public class UserDetail
{
    public DateTime DateOfBirth { get; set; }
}