1

我正在使用以下链接的代码来处理元数据字段:-

https://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata

但是当我尝试为日期类型的元数据字段分配值时,我收到以下 xml 验证错误:-

" System.ServiceModel.FaultException`1 [myPorject.serviceReference.CoreServiceFault]:XML 验证错误。原因:'uuid:myUUID:dateField' 元素无效 - 值 '10/4/2012 03:04:00 AM' 是根据其数据类型“http://www.w3.org/2001/XMLSchema:dateTime”无效 - 字符串“10/4/2012 03:04:00 AM”不是有效的 DateTime 值。(故障详情为等于 myPorject.serviceReference.CoreServiceFault)"

无论我将值分配为字符串还是 DateTime 数据类型,我都会遇到相同的错误,我还尝试使用 Datetime 数据类型重载 AddValue 方法,但到目前为止没有任何效果。

AddValue 方法的代码片段:-

     public void AddValue(string value1)
    {
        string value = string.IsNullOrEmpty(value1) ? null : value1; ;
        XmlElement newElement = fields.AddFieldElement(definition);
        if (value != null) newElement.InnerText = value;
    }

请为日期和数字数据类型提出解决方案。提前致谢

4

5 回答 5

6

错误消息非常明确地表明您的日期格式错误:The string '10/4/2012 03:04:00 AM' is not a valid DateTime value.

Tridion 期望的格式是YYYY-MM-DDThh:mm:ss,所以没有空格、没有时区和没有 AM/PM 标记。

在官方的 Tridion API 中,您通常不必自己进行转换,因为它们接受DateTime对象并将其转换为适合您的正确格式。但是由于您使用的辅助类不是官方 API,它需要一些快捷方式,并且让您将值设置为string.

我通常用来datetime.ToString("u").Replace(" ", "T").Replace("Z", "")以正确的格式获取日期。

于 2012-10-03T11:13:25.903 回答
5

日期字符串应具有如下格式:

  • YYYY-MM-DDThh:mm:ss

例子:

  • “2012-10-03T09:39:43”

除此之外,您设置日期的方式对我来说似乎有点复杂,因为您正在使用内容和元数据包装器,为什么不这样:

string myStringDate = "2012-10-03T09:39:43";
fields["DateFieldName"].Value = myStringDate;
component.Metadata = fields.ToString();
于 2012-10-03T08:03:15.963 回答
2

根据我的 C# 经验,此类错误是由于日期时间格式问题引起的。你可以试试下面的代码

DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd");

我尚未使用您的代码对其进行测试,但希望它适用于您的情况。

于 2012-10-03T05:44:58.993 回答
1

您在格式中缺少日期和时间之间的“T”分隔符。您确实提到输出的日期采用您尝试重新插入的格式,但是无论如何输出都可以格式化,不一定是您必须指定日期的方式。

在此处仔细阅读 XMLSchema dateTime 规范:http: //www.w3.org/TR/xmlschema-2/#dateTime

于 2012-10-03T11:09:21.810 回答
0

经过一些故障排除后,我终于解决了问题以及日期格式。为此,我需要将本地机器的时区与服务器的时区匹配。

以下是重载方法的代码:-

      public void AddValue(DateTime value1)
    {
        DateTime value = value1 == null ? DateTime.MinValue : value1;

        XmlElement newElement = fields.AddFieldElement(definition);
        if (value != null) newElement.InnerText = value.ToString("yyyy-MM-ddThh:mm:ss");
    }
于 2012-10-04T08:24:56.157 回答