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