我看过null以下几种方式表示的元素:
元素存在于xsi:nil="true":
<book>
<title>Beowulf</title>
<author xsi:nil="true"/>
</book>
Run Code Online (Sandbox Code Playgroud)
该元素存在,但表示为一个空元素(我认为这是错误的,因为'空'并且null在语义上是不同的):
<book>
<title>Beowulf</title>
<author/>
</book>
<!-- or: -->
<book>
<title>Beowulf</title>
<author></author>
</book>
Run Code Online (Sandbox Code Playgroud)
返回的标记中根本不存在该元素:
<book>
<title>Beowulf</title>
</book>
Run Code Online (Sandbox Code Playgroud)
该元素有一个<null/>子元素(来自下面的TStamper):
<book>
<title>Beowulf</title>
<author><null/></author>
</book>
Run Code Online (Sandbox Code Playgroud)
是否有正确或规范的方式来表示这样的null价值?还有其他方法吗?
以上示例的XML是人为设计的,所以不要过多地阅读它.:)
我们的Windows 8.1应用程序(WinRT)中存在一个问题,即有时我们保存的文件已损坏.这些文件的文件大小正确,但该文件只包含NUL字符.该文件应包含一个序列化对象作为XML.
为了找到问题,我们不会覆盖该文件,我们执行以下操作:
大多数情况下,一切正常,但有时.timestamp.xml.bak文件和内容文件损坏.除此之外,日志文件也会损坏(也只有NUL字符).整个文件由NUL字符组成.当我查看bak文件和主文件的踪迹时,我看到主文件的大小增加了.这应该是正确的,因为添加了一个新的XML元素.但它不包含XML.
我不知道这是怎么发生以及为什么会发生这种情况.它发生在大约5%的文件中,应该进行编辑,每个损坏的文件在5-20次保存尝试后发生.它也发生在几个平板电脑上.
以下是创建损坏文件的代码片段:
StorageFile file = await lDataFld.CreateFileAsync(filename + ".tmp", CreationCollisionOption.OpenIfExists);
StorageFile oldFile = await dataFld.GetFileAsync(filename + ".xml");
if (oldFile != null)
{
await oldFile.CopyAsync(dataFld, string.Format("{0}.{1}.xml.bak", filename, DateTime.Now.ToString("yyyyMMddHHmmssfffffff")), NameCollisionOption.ReplaceExisting);
}
await file.MoveAndReplaceAsync(await dataFld.GetFileAsync(filename + ".xml"));
Logger.Log(string.Format("Saved {0}.", filename));
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我们如何最终得到只包含NUL字符的文件以及如何/为什么会发生这种情况?甚至可以更好地修复它.
一个小小的问题:我们不能以任何方式重现这个问题,它只发生在我们的生产环境中.