当具有空属性的元素存在时,XML不再能正确读取

时间:2015-09-16 10:09:22

标签: c# xml unity3d

我有一个.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”,也可以。但感觉必须有一个更好的解决方案,而且我知道将来会出现这样的解决方案不可行的情况。我现在已经对此感到头疼了一段时间,我真的很感激任何想法。

0 个答案:

没有答案