Как создать 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()
вместо того, чтобы иметь явную, но избыточную строку формата.