如何正确 access/modify XElement 对象中的属性
How to properly access/modify an attribute in XElement object
我有一些代码可以读取格式良好的 XML 文件。它将读取的每个 XElement 包装到我的对象 (ScriptEventNode) 中,其中我有一些字段允许调用者更改对我们重要的一些元素和属性值。
我也有能力创建我自己的具有相同根元素名称的节点,“事件”来创建评论,Region_start 和 Region_end。
大部分代码似乎都有效,但有一个给我带来了问题。我 setting/changing 的字段之一是时间戳。当我遇到来自原始文件的 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 的值对于其中一个为 null,而对于另一个则不是。
我认为它们的工作方式应该完全相同,因为它是同一类型 XElement 的属性,特别是“事件”。
由于某些原因我无法将其标记为答案,因此我将不得不使用 "answer your own question" 选项。
贝贝珠说的对。这只是一个区分大小写的问题,"TimeStamp" vs. "Timestamp".
我有一些代码可以读取格式良好的 XML 文件。它将读取的每个 XElement 包装到我的对象 (ScriptEventNode) 中,其中我有一些字段允许调用者更改对我们重要的一些元素和属性值。
我也有能力创建我自己的具有相同根元素名称的节点,“事件”来创建评论,Region_start 和 Region_end。
大部分代码似乎都有效,但有一个给我带来了问题。我 setting/changing 的字段之一是时间戳。当我遇到来自原始文件的 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 的值对于其中一个为 null,而对于另一个则不是。
我认为它们的工作方式应该完全相同,因为它是同一类型 XElement 的属性,特别是“事件”。
由于某些原因我无法将其标记为答案,因此我将不得不使用 "answer your own question" 选项。
贝贝珠说的对。这只是一个区分大小写的问题,"TimeStamp" vs. "Timestamp".