Как правильно получить доступ / изменить атрибут в объекте XElement - PullRequest
0 голосов
/ 07 мая 2019

У меня есть код, который читает в красиво отформатированном 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);
            }

        }

При переходе к этому коду с обычным событием xml в _myXElement выглядит следующим образом (в качестве одного примера):

<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 голосов
/ 16 мая 2019

Поскольку по какой-то причине я не могу пометить его как ответ, мне придется использовать опцию «ответить на свой вопрос».

Бейбейжу был прав. Это была просто проблема чувствительности к регистру, «TimeStamp» против «Timestamp».

...