8
votes

C #: lecture / écriture Datetime de / dans xml

J'ai besoin de connaître la manière optimale d'écriture / lecture datetime dans / depuis xml. Devrais-je écrire directement DateTime dans xml ou datetime.tostring () dans xml?

Deuxième question est de savoir comment lire l'élément de date de XML. Peut être utilisé pour cela? Par exemple:

(DateTime) rec.Element ("date"). Valeur

ou, dois-je analyser la chaîne comme celle-ci? Par exemple:

datetime.parse (rec.Element ("date"). Valeur)


0 commentaires

3 Réponses :


19
votes

Vous pouvez utiliser la coulée d'un xelement ou xattribute avec linq sur xml, oui ... mais pas de la ficelle elle-même. LINQ to XML utilise le format XML standard, indépendant de vos paramètres de culture.

échantillon: xxx

sortie pour moi: xxx


18 commentaires

La coulée de xelement est meilleure ou analysant le xelement.value ??


@Pankaj: Je voudrais définitivement utiliser les conversions LINQ vers XML. De cette façon, il utilisera le format standard pour stocker des dates / horaires dans XML, vous pouvez donc interopérer proprement avec un autre code (éventuellement écrit dans d'autres langues).


Qu'entendez-vous par linq à la conversion XML? Désolé si je suis stupide ..: P ... Vous voulez dire que je devrais écrire la date directement dans XML, puis jeter le xelement ... est-ce ce que vous voulez dire ??


@Pankaj: Je veux dire les conversions effectuées par la bibliothèque LINQ vers XML, comme indiqué dans ma réponse.


@Jon: Ok ... bien comme vous pouvez le voir dans votre exemple. Le format change dès que vous lancez l'élément XML. Par conséquent, lorsque le xelement est mis à jour avec cette valeur, elle contiendra le nouveau format. Donc, je pense pourquoi ne changeons-nous pas le format en premier lieu en écrivant XElement ("maintenant", maintenant.Tostring ()). Que dites-vous à ce sujet ??


@Pankaj: le format ne fait pas partie de la valeur pour commencer. Vous devriez définitivement pas juste appeler tostring sur la dateTime. Cela vous obtiendra XML qui dépend de la culture de l'ordinateur que vous l'utilisez. Que signifie "03/05/2011" - le 3 mai ou 5 mars? Il est ambigu que si vous avez également les informations de format (qui ne font pas partie de la valeur ). Le format XML est normalisé et ne souffre pas de ce problème.


@Jon: hmm ... dats un point très valide et important que vous avez fait. Je n'y pensais pas de cette façon ... Merci d'avoir nettoyé l'air. S'il vous plaît dites-moi la bonne façon de mettre à jour l'élément de date existant. En ce moment, je mette à jour le champ comme celui-ci R.Element ("date"). Valeur = date.tostring () .


@Pankaj: Ensuite, je vous suggère d'arrêter de faire ça :) Si vous avez pour mettre à jour un élément existant, vous pouvez utiliser r.Element ("date"). Valeur = xmlconvert.tostring (date , XmlatetimédiatéorialisationMode.roundtripkind);


@Jon: Merci Buddy ... Désolé de prendre autant de votre temps. Maintenant, je vais lire la date comme celle-ci DateTime date = (DateTime) fiche.Element.Element ("date") et mettez-la comme ceci R.Element ("date"). Valeur = xmlonvert. Tostring (date, xmlatetitésérializationmode.roundtripkind);


Quand j'utilise DateTime? (Nullable DateTime), ce code xmlconvert.tostring (date, xmlatetitésériializationmode.roundtripkind) Donner une erreur


@Pankaj: Ensuite, vous devez spécifier date.value - c'est juste une partie normale de l'utilisation des types de valeur nullables. Notez que si vous utilisez plutôt le constructeur xelement, cela arriverait simplement par magie :)


@Jon: Quand j'essaie de mettre à jour à l'aide de "date.value", je reçois la valididoperationException {"L'objet nullable doit avoir une valeur."}. Voici la ligne d'erreur de génération de code: xmlconvert.tostring (DépatchDate.Value, xmlatetitésérializationMode.roundtripkind);


@Pankaj: J'avais supposé que vous avez déjà testé que la date n'était pas nulle avant d'utiliser cela ... À ce stade, nous avons vraiment dépassé Linq vers XML, en discussion générale sur des types de valeur nullables. Je vous suggère de lire les détails de ceux-ci - cela vous aidera à faire face à cela et à d'autres situations.


@Jon: Désolé, dans la dépêche, j'oublie de vérifier la condition null. Oui la date est null c'est pourquoi il donne une erreur


@Jon: Voici ce que je fais maintenant PaiementDate.Hasvalue? Xmlconvert.tostring (paiditionnement.Value, xmlatetimédiaérializationMode.roundtripkind): "" corrigez-moi si vous sentez que le code n'est pas bon


Comment est le DateTime analysé = (DateTime) élément; Capable de lancer un xelement à une date d'heure? J'aurais pensé que cela provoquerait une erreur d'exécution.


@Justin: Regardez la documentation xelement - il fournit une conversion explicite personnalisée. Si ce n'est pas le cas, cela échouerait à la compilation.


Oh je vois, je ne savais pas que cela avait cette fonctionnalité. Merci.



7
votes

Une alternative à la réponse de @jon Skeet est de convertir la dateTime en une chaîne à l'aide du Format" aller-retour ". Cela le convertit à un format qui enregistrera et chargera sans perdre aucune information. xxx

et convertir à nouveau en utilisant denttime.parse (). La page que j'ai liée à a des exemples vous indique comment convertir / à partir du format de chaîne. Tout ce que vous avez à faire est de stocker cette chaîne dans votre XML. Cela vous donne plus de contrôle sur la manière dont les données sont stockées (si vous voulez plus de contrôle, c'est-à-dire).


2 commentaires

Plus de contrôle, mais moins portabilité. XML a normalisé des méthodes de stockage des dates et des heures - je penserais très soigneusement avant de s'écouler délibérément d'eux.


@Jon: Ouais, j'essayais de souligner une manière plus généralisée de sérialiser à / du texte sans perte, mais je ne l'ai pas vraiment dit très bien - comme vous le dites, je me suis écarté du point :-)



5
votes

Vous pouvez utiliser xmlconverver classe à convertir à partir de cordes.


0 commentaires