首页 > 解决方案 > 如何正确访问/修改 XElement 对象中的属性

问题描述

我有一些代码可以读取格式良好的 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 的属性,特别是“事件”。

标签: c#xmlxelementxattribute

解决方案


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

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


推荐阅读