相关疑难解决方法(0)

表示空XML元素的正确方法是什么?

我看过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是人为设计的,所以不要过多地阅读它.:)

xml null xml-nil

160
推荐指数
4
解决办法
18万
查看次数

有时保存的文件只包含NUL字符

我们的Windows 8.1应用程序(WinRT)中存在一个问题,即有时我们保存的文件已损坏.这些文件的文件大小正确,但该文件只包含NUL字符.该文件应包含一个序列化对象作为XML.

为了找到问题,我们不会覆盖该文件,我们执行以下操作:

  1. 将当前对象序列化为临时文件.
  2. 检查临时文件的内容
  3. 复制当前文件(到.timestamp.xml.bak)
  4. 将临时文件移动/替换为当前文件

大多数情况下,一切正常,但有时.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字符的文件以及如何/为什么会发生这种情况?甚至可以更好地修复它.

一个小小的问题:我们不能以任何方式重现这个问题,它只发生在我们的生产环境中.

c# async-await windows-runtime winrt-async

6
推荐指数
1
解决办法
880
查看次数

标签 统计

async-await ×1

c# ×1

null ×1

windows-runtime ×1

winrt-async ×1

xml ×1

xml-nil ×1