【问题标题】:The string '3/18/09 10:16 PM' is not a valid AllXsd value字符串 '3/18/09 10:16 PM' 不是有效的 AllXsd 值
【发布时间】:2010-10-14 07:06:41
【问题描述】:

显然读者不喜欢这种从响应 XML 中传入的格式。

想知道我是否可以重新格式化它。尝试使用以下代码与我的XmlReader 转换为DateTime

reader.ReadContentAsDateTime();

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

    根据 XML schema 规范,日期时间值应采用 ISO8601 格式,例如,

    2009-03-13T22:16:00
    

    【讨论】:

    • 在 ruby​​ 中使用iso8601 方法,例如Time.now.iso8601
    • 出于好奇,ISO8601 格式应该类似于2009-03-18T22:16:00-05:00,但大卫的回答(省略时区)也适用于我(而 ISO8601 格式不适用)。这是因为 XmlConverter 中的本地序列化(因此不需要时区)吗?
    • 在 ISO8601 中,时区是可选的,所以我的原始字符串和你的字符串都是有效的 ISO8601 日期时间。根据w3.org/TR/xmlschema-2/#deviantformats,时区在 XML 模式中也是可选的。我不确定为什么时区版本不适合您。
    • 对于 php Artisans:) 在nesbot/carbon php lib 中有toIso8601String 方法。
    • 在 php 中可以使用 date('c', $time);
    【解决方案2】:

    Xml 阅读器通常希望日期/时间采用非常特定的格式;你可以自己使用XmlConvert:

    string s = XmlConvert.ToString(DateTime.Now);
    DateTime when = XmlConvert.ToDateTime(s);
    

    如果您使用其他内容,则必须将其作为字符串读取并使用DateTime.TryParseExact(或类似名称)来指定实际的格式字符串:

    string s = reader.ReadContentAsString();
    DateTime when = DateTime.ParseExact(s, "M/d/yy hh:mm tt",
         CultureInfo.InvariantCulture);
    

    如果您使用 XmlSerializer,您可以使用 shim 属性进行转换 - 如果您正在这样做,请告诉我...

    【讨论】:

    • 我输入的数据恰好是 10/29/2012 15:25 并且失败了。当我将其更改为 2012 年 10 月 11 日 15:25 时,它起作用了。
    • @MarcGravell,当我尝试使用 XmlSerializer 反序列化某些 rss 提要时,PubDate 元素会导致错误。我该如何解决?
    • @burhan 通过查看传入的值并适当地处理它?或者,核心框架包括可能会做得更好的面向 RSS 的类。
    • @burhan 不是没有看到 xml 和你的模型,没有
    • @burhan 解决方案一如既往地拥有 xml 和匹配的模型。有时这意味着您可以直接使用 - 您可能需要将日期作为字符串类型(而不是 DateTime),然后对其进行额外的后处理以解析时间。但是,随机链接不能提供您正在努力解决的确切 xml。
    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2011-02-23
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多