2012-07-17 6 views
10

sto usando XDocument per creare un file XML, come segue:Come creare XElement data che rappresenta in DateTime come tipo xs: Data

var d = DateTime.Now; 

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

Tuttavia, l'XML risultante rappresenta la data d con i xs: formato datetime (es. "2012-05-11T00: 00: 00"). Cioè, include informazioni sul tempo.

Tuttavia, il mio XML deve corrispondere al mio schema XML, che definisce l'elemento come di tipo "xs: date". Di conseguenza, il file viene rifiutato quando convalidato rispetto allo schema, a causa delle informazioni sul tempo extra.

Come posso risolvere questo? So che potrei semplicemente formattare la data usando me stesso ToString() con un formato, ma questo non può essere il modo "giusto" per farlo, sicuramente. Non ci si può aspettare che sappia come formattare una data come data XML valida: questo è il lavoro delle parti del framework relative all'XML.


Edit: si prega di notare che io faccio sanno come formattare una data utilizzando ToString(), e so anche che cosa stringa di formato mi avrebbe dato il risultato giusto. Questa non è la risposta che sto cercando. Sto cercando una funzione/metodo/classe che capisca cosa sia una xs: date (ecc.) E che supporti quei tipi di codifiche.

Per essere chiari, non sto cercando di "averlo fatto", sto cercando di "farlo bene". E reinventare la ruota XML non significa "farlo nel modo giusto" nel mio libro.

+1

credo si avrebbe bisogno di specificare il formato utilizzando 'ToString()' altro il suo solo convertendo l'oggetto si passa alla sua variante stringa dal '.ToString()' in modo da avere a passare in costume format – V4Vendetta

risposta

5

Come già sottolineato LINQ to XML non è in grado di produrre un valore DateTime utilizzando il formato xs:date. A DateTime round-trip in LINQ to XML utilizzando il formato xs:dateTime e.NET non ha un tipo solo per la data, quindi non è una sorpresa che i progettisti di LINQ in XML abbiano deciso di utilizzare solo xs:dateTime per non complicare l'API.

L'unica opzione è quella di formattare la data come una stringa dandoti il ​​pieno controllo del formato. Per utilizzare correttamente il formato xs:date è necessario convertire il DateTime in una stringa utilizzando questo codice:

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

Utilizzando ToShortDateString e/o non specifica una CultureInfo non produrrà il risultato desiderato.

0

Sembra esserci qualche confusione XML o come tale XElement memorizzerà il valore come una stringa. Ciò che è archiviato è più un lavoro di Xml Schema Validator.

Di conseguenza, quando è necessario rappresentare Date, è necessario passare nella versione stringa della parte Data che è possibile utilizzare il ToShortDateString() o il formato personalizzato in ToString().

Quando si passa l'istanza DateTime è sufficiente chiamare ToString() che contiene anche il componente Ora.

Spero che questo ti aiuti.

+0

Capisco che XElement memorizzi una stringa. La mia domanda è, però, come creare la stringa senza ricorrere a una stringa di formato hard-coded. Ci deve essere una funzione all'interno dello spazio dei nomi X ... per fare questo per me? –

0

A DateTimesempre dispone di componenti di data e ora. Quindi il trucco è dire che DateTime emette solo il suo componente data. Quando si ricostituisce la data sul lato ricevente, l'ora verrà impostata automaticamente a mezzanotte.

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

La forma di default è M/d/yyyy, ma ancora non può essere nel formato giusto! Non so cosa si aspetta il tuo schema.

Così utilizzare ToString("yourFormatStringHere")

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

Se si desidera ottenere veramente fantasia, vale a dire, scrivere codice robusto ... Tirare la stringa di formato dal documento dello schema di riferimento e che nel metodo ToString() piuttosto che avere un stringa di formato esplicita ma ridondante.

+0

Grazie, ma come ho "detto" a V4Vendetta, non penso sia appropriato per me sapere come formattare correttamente una data XML. Voglio dire, io * do * so come (yyyy-MM-dd), ma non penso che un'API di creazione XML sia completa senza avere una funzione per farlo. Quindi sono abbastanza fiducioso che ci sarà una funzione per farlo da qualche parte - e la mia domanda è semplicemente "dove?". –

+1

E per la cronaca, la forma di una xs: date non è definita dal mio schema, ma dal W3C :-) –

+0

Forse 'XmlReader.ReadAsDateTime()' farà. Per impostazione predefinita, tenta DateTime (ing) in base alle regole del W3C. – radarbob

2

ho risolto questo problema utilizzando la seguente classe per DateElements

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

Il vantaggio di usare una classe come questa, che si ha la conversione data specifica in un solo posto.

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