使用 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
})
})
});
}
有人可以帮我吗?
试试这个:-
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;
}
}
}