11

次のように、XDocumentを使用してXMLファイルを作成しています。

var d = DateTime.Now;

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

ただし、結果のXMLは、xs:datetime形式(「2012-05-11T00:00:00」など)を使用して日付dを表します。つまり、時間情報が含まれます。

ただし、私のXMLは、要素を「xs:date」型として定義するXMLスキーマと一致するように意図されています。その結果、余分な時間情報のために、スキーマに対して検証されたときにファイルが拒否されます。

どうすればこれを修正できますか?ToString()を使って自分で日付をフォーマットできることは知っていますが、これは確かに「正しい」方法ではありません。日付を有効なXML日付としてフォーマットする方法を知ることは期待できません。これは、フレームワークのXML関連部分の仕事です。


編集: ToString()を使用して日付をフォーマットする方法を知っていることに注意してください。また、どのフォーマット文字列が正しい結果をもたらすかについても知っています。それは私が探している答えではありません。xs:date(など)が何であるかを理解し、それらの種類のエンコーディングをサポートする関数/メソッド/クラスを探しています。

明確にするために、私は「それを成し遂げる」ことを望んでいません、私は「それを正しくすること」を探しています。そして、XMLホイールを再発明することは、私の本では「正しく行う」ことではありません。

4

4 に答える 4

7

すでに指摘されているように、LINQtoXMLはこの形式DateTimeを使用して値を生成できません。フォーマットと.NETを使用したLINQtoXMLxs:dateのラウンドトリップには日付のみのタイプがないため、LINQtoXMLの設計者がAPIを複雑にしないためにのみ使用することを決定したのは当然のことです。DateTimexs:dateTimexs:dateTime

唯一のオプションは、日付を文字列としてフォーマットして、フォーマットを完全に制御できるようにすることです。フォーマットを正しく使用するには、次のコードを使用してを文字列xs:dateに変換する必要があります。DateTime

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

を使用ToShortDateStringおよび/または指定しCultureInfoないと、目的の結果が得られません。

于 2013-09-13T19:40:36.323 に答える
3

DateElementsの次のクラスを使用してこの問題を修正しました

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

このようなクラスを使用する利点は、特定の日付変換を1か所でしか行えないことです。

var d = DateTime.Now;
var xDocument = new XDocument(new XDateElement("ThisIsADate", d));
于 2015-04-09T14:55:34.760 に答える
0

XMLに混乱が生じているようです。そのため、XElementは値を文字列として格納します。保存されるのは、XmlSchemaValidatorの作業です。

したがって、表現Dateする必要がある場合は、日付部分の文字列バージョンを渡す必要があります。ToShortDateString()またはのカスタム形式を使用できますToString()

DateTimeインスタンスを渡すときは、Timeコンポーネントも含むToString()を呼び出すだけです。

これがお役に立てば幸いです。

于 2012-07-17T12:15:16.530 に答える
-1

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()、明示的で冗長なフォーマット文字列ではなく、メソッドでそれを参照します。

于 2012-07-17T15:57:19.340 に答える