Как создать XElement, представляющий дату в DateTime, как тип xs: Date

Я использую XDocument для создания XML файла следующим образом:

var d = DateTime.Now;

var xDocument = new XDocument(new XElement("ThisIsADate", d));

Однако полученный XML представляет дату d с использованием формата xs: datetime (например, "2012-05-11T00: 00: 00" ). То есть он включает информацию о времени.

Однако мой XML должен соответствовать моей XML-схеме, которая определяет элемент как тип "xs: date". Следовательно, файл отклоняется при проверке с помощью схемы из-за дополнительной информации о времени.

Как я могу это исправить? Я знаю, что могу просто форматировать дату самостоятельно, используя ToString() с форматом, но это не может быть "правильным" способом сделать это, конечно. Я не ожидаю, что буду знать, как отформатировать дату как допустимую дату XML - работу с XML-компонентами структуры.


Изменить: обратите внимание, что я знаю, как форматировать дату с помощью ToString(), и я также знаю, какая строка формата даст мне правильный результат. Это не тот ответ, который я ищу. Я ищу функцию/метод/класс, которая понимает, что такое xs: date (и т.д.), И поддерживает те виды кодировок.

Чтобы быть ясным, я не хочу "делать это", я ищу "сделать это правильно". И повторное изобретение XML-колесика не "делает это правильно" в моей книге.

Ответ 1

Как уже отмечалось, LINQ to XML не может создать значение DateTime, используя формат xs:date. A DateTime round-trip в LINQ to XML с использованием формата xs:dateTime и .NET не имеет типа даты, поэтому не удивительно, что разработчики LINQ to XML решили использовать только xs:dateTime для не усложнять API.

Единственная опция - форматировать дату как строку, дающую вам полный контроль над форматом. Чтобы правильно использовать формат xs:date, вам нужно преобразовать DateTime в строку с помощью этого кода:

d.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)

Использование ToShortDateString и/или отсутствие указания CultureInfo не приведет к желаемому результату.

Ответ 2

Я исправил эту проблему, используя следующий класс для DateElements

private class XDateElement : XElement
{
   public XDateElement(XName name, DateTime Date) : 
     base(name, Date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture))
   { }
}

Преимущество использования такого класса в том, что у вас есть конкретное преобразование даты только в одном месте.

var d = DateTime.Now;
var xDocument = new XDocument(new XDateElement("ThisIsADate", d));

Ответ 3

Кажется, что есть какой-то путаный XML, или как таковой XElement будет хранить значение как строку. То, что хранится, скорее является работой Validator Xml Schema.

Следовательно, когда вам нужно представлять Date, вам нужно будет передать строчную версию части Date, вы можете использовать ToShortDateString() или собственный формат в ToString().

Когда вы передаете экземпляр DateTime, он просто вызывает ToString(), который также содержит компонент Time.

Надеюсь, это поможет вам.

Ответ 4

A DateTime всегда имеет как дату, так и время. Итак, трюк говорит, что DateTime выводит только этот компонент даты. Когда вы восстанавливаете дату на принимающей стороне, время будет по умолчанию равно полуночи.

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToShortDateString()));

Форма по умолчанию M/d/yyyy, но она может быть не в правильном формате! Я не знаю, что ожидает ваша схема.

Поэтому используйте ToString("yourFormatStringHere")

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToString("M-dd-yyyy")));

Если вы хотите получить действительно фантазию, то есть написать надежный код... Извлеките строку формата из документа схемы и укажите, что в методе ToString() вместо того, чтобы иметь явную, но избыточную строку формата.