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

本文关键字:对象 列表 存储 LINQ 读取 xml 使用 | 更新日期: 2023-09-27 18:31:46

我有以下格式的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>

有许多这种格式的 xml 文件。我想读取所有 xmls 并存储在一个列表中:使用 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
                                                        })
                     })
                });
        }

有人可以帮我吗?

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

试试这个:-

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; }
}

编辑:

我认为您的用户详细信息不会是测试用例类型的List,因此根据该假设更新了代码。

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

要获取 XML 文件,以下是我的代码:

 TextReader Treader = null;
 Treader = new StreamReader(fullFileName);
 ContactsModel = (ContactsDBModel)OSINFO.FromXml<ContactsDBModel>(Treader);

辅助器如下:

public static string ToXml(object obj)
    {
        XmlSerializer s = new XmlSerializer(obj.GetType());
        using (StringWriterWithEncoding writer = new StringWriterWithEncoding(Encoding.UTF8))
        {
            s.Serialize(writer, obj);
            return writer.ToString();
        }
    }
    public static object FromXml<T>(this TextReader data)
    {
        XmlSerializer s = new XmlSerializer(typeof(T));
        object obj = s.Deserialize(data);
            return (T)obj;
    }

我为UTF8编码添加了一个自定义类StringWriterWithEncode。

public class StringWriterWithEncoding : StringWriter
{
    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding)
        : base(sb)
    {
        this.m_Encoding = encoding;
    }
    public StringWriterWithEncoding(Encoding encoding)
        : base()
    {
        this.m_Encoding = encoding;
    }
    private readonly Encoding m_Encoding;
    public override Encoding Encoding
    {
        get
        {
            return this.m_Encoding;
        }
    }
}