如何正确访问/修改XElement对象中的属性

时间:2019-05-07 01:21:29

标签: c# xml xelement xattribute

我有一些代码可以读取格式正确的XML文件。它将读取到的每个XElement包裹到我的对象(ScriptEventNode)中,在该对象中,我有一些字段允许调用者更改一些对我们重要的Element和Attribute值。

我还可以创建自己的节点,该节点具有相同的根元素名称“事件”以创建注释Region_start和Region_end。

大多数代码似乎都可以工作,但是其中一个给了我一些问题。我要设置/更改的字段之一是时间戳。当我遇到来自原始文件的一个ScriptEventNodes时,它会设置正确的时间戳,但是当我到达我创建的其中一个(如评论节点)时,它将给出一个空引用异常。

设置时间戳的代码在这里:

        // Timestamp range must be from 1/1/01 00:00:00 to 1/1/01 23:59:59
        private DateTime _timestamp;
        public DateTime Timestamp
        {
            set
            {
                DateTime minDT = DateTime.ParseExact(InitialTimeStamp, "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
                DateTime maxDT = DateTime.ParseExact("2000-01-01T23:59:59", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
                if (value >= minDT && value <= maxDT) // validate within timestamp range
                {
                    try
                    {
                        string ts = value.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
                        _myXElement.Attribute("TimeStamp").Value = ts;
                        _timestamp = value;
                    }
                    catch (Exception e)
                    {
                        LogManager.LogExceptionMessage(e);
                    }                                        
                }
            }
            get
            {
                try
                {
                    string ts = _myXElement.Attribute("TimeStamp").Value;
                    return DateTime.ParseExact(ts, "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
                }
                catch (Exception e)
                {
                    LogManager.LogExceptionMessage(e);                    
                }
                return DateTime.ParseExact(InitialTimeStamp, "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
            }

        }

带有常规事件的此代码来到_myXElement中的xml看起来像这样(作为一个示例):

<Event TimeStamp="2017-08-03T09:19:28" TimeFraction="545302" Index="0">
  <EventOriginatorInfo SoftwareModule="PercuNav" />
  <EventInfo InfoCategory="UIEvent" LogCategory="Workflow" EventCategory="Information" EventID="600000.J329.LXBW.0" Description="Successfully loaded bCore.dll" >
    <AdditionalInfo  >
      <MESSAGE_CATEGORY>PNAP</MESSAGE_CATEGORY>
    </AdditionalInfo>
  </EventInfo>
</Event>

我创建的其中一个(例如,像注释节点)如下所示:

<Event Timestamp="2000-01-01T00:00:00" TimeFraction="000000" Index="0">
    <COMMENT>Spiffy little UISCRIPT comment!!</COMMENT>
  </Event>

对于我的一生,我不明白为什么我会在网上遇到例外情况:

_myXElement.Attribute("TimeStamp").Value = ts;

希望有人可以看到有什么不同。

在尝试调试行之前,我只是想看看XAttribute。

XAttribute a = _myXElement.Attribute("TimeStamp");

您可能会猜到,a的值对于一个是空的,而对另一个则不是。

我认为它们应该以完全相同的方式工作,因为它是XElement的相同类型的属性,特别是“ Event”。

1 个答案:

答案 0 :(得分:0)

由于某种原因我无法将其标记为答案,因此我必须使用“回答您自己的问题”选项。

贝贝珠是正确的。这只是一个区分大小写的问题,“ TimeStamp”与“ Timestamp”。