XMLReader正确读取一些值,然后变为空白

时间:2016-05-24 19:26:14

标签: c# xml

美好的一天,在我的项目中,我将所有数据保存到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>

2 个答案:

答案 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;

将读者设置在正确的位置。