从 XML 元素解析日期时间

本文关键字:日期 时间 XML 元素 | 更新日期: 2023-09-27 18:32:22

var xml = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
                        <metadata created=""2014-11-03T18:13:02.769Z"" xmlns=""http://example.com/ns/mmd-2.0#"" xmlns:ext=""http://example.com/ns/ext#-2.0"">
                            <customer-list count=""112"" offset=""0"">
                                <customer id=""5f6ab597-f57a-40da-be9e-adad48708203"" type=""Person"" ext:score=""100"">
                                    <name>Bobby Smith</name>
                                    <gender>male</gender>
                                    <country>US</country>
                                    <date-span>
                                        <begin>1965-02-18</begin>
                                        <end>false</end>
                                    </date-span> 
                                </customer> 
                                <customer id=""22"" type=""Person"" ext:score=""100"">
                                    <name>Tina Smith</name>
                                    <gender>Female</gender>
                                    <country>US</country>
                                    <date-span>
                                        <end>false</end>
                                    </date-span> 
                                </customer>
                                <customer id=""30"" type=""Person"" ext:score=""500"">
                                    <name>George</name>
                                    <gender>Male</gender>
                                    <country>US</country>
                                    <date-span>
                                        <begin>1965</begin>
                                        <end>false</end>
                                    </date-span> 
                                </customer> 
                            </customer-list>    
                         </metadata>";

我使用上面的XML。我遇到的问题是日期(im指的是<date-span> <begin>元素)可以是任何格式。所以我正在尝试使用以下代码来处理日期格式

GetCustomers = from c in XDoc.Descendants(ns + "customer")
                                  select
                                  new Customer
                                  {
                                      Name = c.Element(ns + "name").Value,
                                      DateOfBirth = Convert.ToDateTime(c.Element(ns + "date-span").Elements(ns + "begin").Any() ? c.Element(ns + "date-span").Element(ns + "begin").Value : DateTime.Now.ToString())
                                  };

上述工作,但在 XML 包含 1965 年后立即崩溃 - 不幸的是,我无法控制 XML。所以我尝试使用 TryParse 将 1965 转换为 dd/mm/1965,其中 dd 和 mm 可以是今天的日期和当前月份,但我似乎无法让它工作:

BeginDate = Convert.ToDateTime(c.Element(ns + "life-span").Elements(ns + "begin").Any() ? DateTime.TryParse( c.Element(ns + "life-span").Element(ns + "begin").Value, culture, styles, out dateResult) : DateTime.Now).ToString())

谁能在这里指导我如何解决问题?

编辑 1

var ModifyBeginDate = XDoc.Descendants(ns + "artist").Elements(ns + "date-span").Elements(ns + "begin");

上面检索了所有日期,但是在将它们更改回XML后如何分配值(我认为我不能在我的代码中使用此变量,因为当我遍历XML时,它会直接返回到原始XML)

从 XML 元素解析日期时间

如果数据可以是任何格式,那么在尝试将数据解析为 DateTime 之前,您必须对数据进行预处理。

如果我要

实现这一点,我要做的第一件事就是将输入分解为一个整数数组,如果数组中只有一个项目,我会检查长度,如果它是 4 长,那么我会假设它是一年并实例化一个新的 DateTime 1 月 1 日, 随着年份。如果我找到一个长度为 4,2,2 或 2,2,4 的数组,我会相应地解析它们 - 显然会有一些可以猜测,但如果你不能控制 xml 的格式,总会有一些机会

您可以使用这样的东西(但修改为仅返回整数类型并跳过可能/-等的拆分类型)将日期时间拆分为包含整数值的数组:https://stackoverflow.com/a/13548184/184746