美好的一天,在我的项目中,我将所有数据保存到XML文件中。当您启动程序时,它会从所述XML文件(Name:ProjectList.xml)中读取。
我已经搜索过,并阅读了相当多的“类似”问题,在那里我尝试了他们的解决方案,但它仍然提出了相同的问题。
所以,问题是:
我可以很好地阅读'ID'和'员工ID'值,我甚至可以使用相同的代码从软件的其他部分读取我的员工数据,它可以100%运行。但由于某些原因,当它必须读取TimeStart和TimeStop值时,字符串将返回“”(空)。
我在从XML读取纯整数方面遇到了类似的问题,但是用
修复了这个问题ReadElementContentAsInt()
试过类似的
ReadElementContentAsDateTime()
看到它是DateTime
直接写的DateTime.ToString()
值。但它也会返回“”(空)。
我欢迎任何建议,除了摆脱XML:P
示例代码:
if (File.Exists(FileName))
using (XmlReader reader = XmlReader.Create(FileName))
{
while (reader.Read())
{
if (reader.IsStartElement())
{
switch (reader.Name)
{
... (Shortening example of code for the sake of relevancy)
case "TimeStart":
string str = reader.ReadOuterXml();
DateTime t = DateTime.ParseExact(str, "yyyy/MM/dd hh:mm:ss tt", CultureInfo.InvariantCulture);
_ProjectData[count].TimeStamps[c].Start = t;
break;
case "TimeStop":
t = DateTime.ParseExact(reader.Value.Trim(), "yyyy/MM/dd hh:mm:ss tt", CultureInfo.InvariantCulture);
_ProjectData[count].TimeStamps[c].Stop = t;
break;
}
}
}
}
示例XML文件:
<Projects>
<Project>
<ID>D11</ID>
<TimeStamps>
<TimeStamp>
<EmployeeID>0</EmployeeID>
<TimeStart>2016/05/24 8:47:30 PM</TimeStart>
<TimeStop>2016/05/24 8:47:32 PM</TimeStop>
</TimeStamp>
</TimeStamps>
</Project>
<Project>
<ID>D12</ID>
<TimeStamps>
<TimeStamp>
<EmployeeID>0</EmployeeID>
<TimeStart>2016/05/24 8:51:06 PM</TimeStart>
<TimeStop>2016/05/24 9:31:27 PM</TimeStop>
</TimeStamp>
<TimeStamp>
<EmployeeID>0</EmployeeID>
<TimeStart>2016/05/24 9:47:44 PM</TimeStart>
<TimeStop>2016/05/24 10:51:11 PM</TimeStop>
</TimeStamp>
</TimeStamps>
</Project>
</Projects>
答案 0 :(得分:0)
LINQ to XML是一个非常好的API,可让您使用LINQ查询轻松查询XML。例如,此查询可让您按ID查找项目并获取(仅)时间戳的开始时间 - 但您可以编写任何类型的查询,实际上:
var doc = XDocument.Load(fileName);
var startForD11 = (DateTime)doc
.Descendants("Project")
.Where(x => (string) x.Element("ID") == "D11")
.Descendants("TimeStart")
.Single();
或获取所有时间戳:
var timestamps =
from project in doc.Descendants("Project")
let projectId = (int) project.Element("ID")
from timestamp in project.Descendants("Timestamp")
select new
{
ProjectId = projectId,
EmployeeId = (int) timestamp.Element("EmployeeID"),
TimeStart = (DateTime) timestamp.Element("TimeStart"),
TimeEnd = (DateTime) timestamp.Element("TimeEnd"),
};
有关正常工作的演示,请参阅this fiddle。如果你没有遇到它,可能值得进一步调查。
答案 1 :(得分:0)
您可以使用ReadElementContentAsString()获取字符串值。 Value
属性本身为空,因为NodeType
属性为Element
,在这种情况下,reader将始终返回空字符串。
或者你可以尝试
reader.Read();
string str = reader.Value;
DateTime t = DateTime.ParseExact(str, "yyyy/MM/dd hh:mm:ss tt", CultureInfo.InvariantCulture);
_ProjectData[count].TimeStamps[c].Start = t;
将读者设置在正确的位置。