我有一个.xml文件,它以多种方式进行修改和读取,但是当添加属性比其他元素少一个的元素时,很多代码都不再有效。
.xml文件的一般结构如下:
<?xml version="1.0" encoding="utf-8"?>
<Records>
<Export_Number>1</Export_Number>
<Current_Activity_Number>4</Current_Activity_Number>
<Activities>
<Activity ID="1" Section="Section1" Type="Type1">
<Date>10/9/2011</Date>
<Details>Details go here</Details>
</Activity>
<Activity ID="2" Section="Unlisted">
<Date>12/09/2008</Date>
<Details>Details go here</Details>
<Notes>Notes go here</Details>
</Activity>
</Activities>
</Records>
如您所见,具有属性Section =“Unlisted”的活动条目没有属性“Type”。这似乎导致了几个问题(问题不是由具有这两个属性的其他条目引起的),如下所示:
问题1 - [InputWorker.cs]用于输入条目的弹出窗口不会自动关闭,因为我得到if (p.Attribute("ID").Value == activityNumber.ToString())
的空引用异常,尽管事实是此属性存在,整个条目在XML文件中正确显示和保存。其中p是foreach (XElement p in lineElement.Element("Activities").Descendants("Activity"))
。 lineElement没有错误。下面一行的Debug.Log (p.Attribute("ID").Value.ToString());
可正常工作,打印正确的数字。
问题2 - [ActivityFeed.cs]条目通常会显示在屏幕上由于此错误而不显示(在添加此条目之前,它们在日期顺序中显示相关性):
NullReferenceException: Object reference not set to an instance of an object
ActivityFeed.<ActivityFeedA>m__0 (System.Xml.Linq.XElement objActs) (at Assets/Scripts/ActivityFeed.cs:137)
System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.Xml.Linq.XElement,<>__AnonType0`2[System.Xml.Linq.XElement,System.TimeSpan]].MoveNext ()
System.Collections.Generic.List`1[<>__AnonType0`2[System.Xml.Linq.XElement,System.TimeSpan]].AddEnumerable (IEnumerable`1 enumerable) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:128)
等
错误消息将此问题突出显示为此段代码的orderby部分:
var all =
from objActs in xDocument.Element("Records").Element("Activities").Descendants("Activity")
let actDate = DateTime.Now - DateTime.ParseExact(objActs.Element("Date").Value,"d/M/yyyy",new CultureInfo("en-GB"))
orderby actDate
select objActs;
问题3 - [Exporter.cs]只能在错误发生之前写入(到.txt)部分。虽然,如上所述,它表示错误发生在日期排序部分,它似乎实际上发生在file.WriteLine(objActs.Element("Date").Value+lineBreak)
,因为在此之前写的.txt文件的所有部分都出现在文件中。
我理解只是更改我的代码以使每个条目都具有type属性,即使其值为“null”或“n / a”,也可以。但感觉必须有一个更好的解决方案,而且我知道将来会出现这样的解决方案不可行的情况。我现在已经对此感到头疼了一段时间,我真的很感激任何想法。