Newtonsoft.Json
ライブラリJsonConvert.DeserializeXmlNode
は、要素に属性がある場合、一貫性のない日時の結果を返します。ここでNewtonsoft.Json要素が属性を持つときにXmlDocumentの日付書式が矛盾する場合
は、あなたが見ることができるように発行し
public void Main(string[] args)
{
var now = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
var xml = $"<timestamp>{now}</timestamp>";
Debug.WriteLine(xml);
// <timestamp>2016-11-14T14:51:32</timestamp>
var json = XmlToJson(xml);
Debug.WriteLine(json);
// {"timestamp":"2016-11-14T14:51:32"}
var good = JsonToXml(json);
Debug.WriteLine(good);
// <?xml version="1.0" encoding="utf-8"?><timestamp>2016-11-14T14:51:32</timestamp>
var xml_with_attr = $"<timestamp id=\"1\">{now}</timestamp>";
Debug.WriteLine(xml_with_attr);
// <timestamp id="1">2016-11-14T14:51:32</timestamp>
var json_with_attr = XmlToJson(xml_with_attr);
Debug.WriteLine(json_with_attr);
// {"timestamp":{"@id":"1","#text":"2016-11-14T14:51:32"}}
var bad = JsonToXml(json_with_attr);
Debug.WriteLine(bad);
// <?xml version="1.0" encoding="utf-8"?><timestamp id="1">2016-11-14 2:51:32 PM</timestamp>
}
private string XmlToJson(string xml)
{
var doc = new XmlDocument();
doc.LoadXml(xml);
var json = JsonConvert.SerializeXmlNode(doc);
return json;
}
private string JsonToXml(string json)
{
var doc = JsonConvert.DeserializeXmlNode(json);
var xml = string.Empty;
var settings = new XmlWriterSettings
{
CloseOutput = true,
Encoding = Encoding.UTF8,
};
using (var ms = new MemoryStream())
using (var xw = XmlWriter.Create(ms, settings))
{
doc.WriteTo(xw);
xw.Flush();
xml = settings.Encoding.GetString(ms.ToArray());
}
return xml;
}
を実証小さな例で、bad
日付は、すべての以前の結果と同じ形式ではありません。これは残念なことにXMLがスキーマに対して検証されるとスキーマ検証に失敗する原因となります。
私はDateTimeConverter
について知っていますが、XmlDocumentとの間で変換を行っても、そのオプションは得られません。
また、実行時にどうなっているかわからないので、残念ながら - スキーマ生成クラスのJsonConvert
を実行できません。
要素に属性があるときに、同じ形式を戻す方法を知っている人はいますか?
Json.NET 10.0.1で修正されたおかげで
ありがとうございました!私は確かに問題を報告します。 – bixarrio