【问题标题】:Define dateTime format in xsd在 xsd 中定义 dateTime 格式
【发布时间】:2015-03-11 10:36:44
【问题描述】:

在我的工作中,我们加载 excel 文件并将它们保存在数据库中。
这基本上是流程:
我们将数据从 Excel 文件导入 DataSet,其中每个工作表都加载到 DataSet 内自己的 DataTable 中。填充 DataDet 后,我​​想验证 DataSet 中的数据,比如说第一个 DataTable。我通过使用 DataTable 类的 WriteXml() 方法从 DataTable 中获取 xml,并将此 xml 加载到 XDocument 中。然后,我将 XDocument 类的 Validate() 方法与预定义的 xsd 一起使用,该 xsd 被加载到 XmlSchemaSet 对象中。

问题是excel中的数据存储格式和xsd中dateTime的格式不同。
我们得到的 Excel 文件的日期时间列格式如下:'12/01/2015 12:44:45',而 xsd 中的日期时间格式应该是这样的:'2015-01- 12T12:44:45'

是否可以在 xsd 文件中定义自定义日期时间格式?

例如,我希望它不是 '2015-01-12T12:44:45',而是 '12/01/2015 12:44:45' strong>,所以我的 xml 元素看起来像这样:

<createDate>12/01/2015  12:44:45>/createDate>  

此外,我不介意时间部分是否会被完全忽略

另外,我需要的另一种自定义xsd格式是这样的:378,216.00

是否可以在我的 xsd 文件中定义它?

这是我们验证从数据表中检索到的 xml 的代码

public string[] ValidateExcelFromXsdFile(string schemaUri)
    {
        _validationErrors.Clear();

        var schemas = new XmlSchemaSet();
        schemas.Add("", schemaUri);

        var doc = XDocument.Parse(GetXml(_dataSetFromExcel.Tables[0]));

        doc.Validate(schemas, (sender, args) => _validationErrors.Add(args.Message));

        return _validationErrors.ToArray();
    }

【问题讨论】:

  • 您确实希望 C# 代码序列化/导出以编写这种特殊的 dateTimeFormat,对吗?在这种情况下,请添加您的源代码。如果我误解了你,请澄清。
  • 不,我很抱歉,我不是这个意思。我将数据从 Excel 文件导入到 DataSet 中,其中每个工作表都加载到 DataSet 内自己的 DataTable 中。填充 DataDet 后,我​​想验证 DataSet 中的数据,比如说第一个 DataTable。我通过使用 DataTable 类的 WriteXml() 方法从 DataTable 中获取 xml,并将此 xml 加载到 XDocument 中。然后,我将 XDocument 类的 Validate() 方法与预定义的 xsd 一起使用,该 xsd 被加载到 XmlSchemaSet 对象中。
  • 这里是代码public string[] ValidateExcelFromXsdFile(string schemaUri) { _validationErrors.Clear(); var schemas = new XmlSchemaSet(); schemas.Add("", schemaUri); var doc = XDocument.Parse(GetXml(_dataSetFromExcel.Tables[0])); doc.Validate(schemas, (sender, args) =&gt; _validationErrors.Add(args.Message)); return _validationErrors.ToArray(); }
  • edit您的问题添加信息,尤其是代码。放在 cmets 里就意味着很容易漏掉,也不能正确格式化。

标签: c# .net xml xsd


【解决方案1】:

您可以使用正则表达式为格式为“dd/mm/yyyy hh:mm:ss”的字符串定义模式,但结果值不会是 xs:dateTime,并检查是否完全有效(leap年等)有点像噩梦(可以做到,但会导致大约一英里长的正则表达式)。

这里更好的解决方案可能是先转换后验证模式,在该模式中,您可以在验证输入文档之前对其进行预处理(转换为标准 XSD 格式)。如果您愿意,您甚至可以在预处理阶段进行一些验证。

Saxon 模式处理器有一个预处理方面,它允许您在模式处理之前声明一些值的重新排列,这正是您在这里需要的(对于您的两个用例),但不幸的是它不是标准的。

【讨论】:

    【解决方案2】:

    检查这个网站 - 你有 DateTime 数据类型http://www.w3schools.com/schema/schema_dtypes_date.asp

    日期和时间数据类型段落也允许您根据需要调整规则。

    【讨论】:

    • 感谢 Krzysztof,我注意到有一个可用于 xsd 的模式。你知道怎么用吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2021-06-14
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2011-08-12
    相关资源
    最近更新 更多