本文来自李明子csdn博客(http://blog.youkuaiyun.com/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!
本文中的示例代码编写于2013年5月,为笔者预研OpenXES所写。代码中包含了XES的主要元素,展示了使用OpenXes对序列化XES文件的方法。鉴于当时的产品开发环境环境,本文代码由C#编写。因OpenXES是基于java的开发库,故笔者使用IKVM对其进行了转换包装。
以下是示例代码。
/// <summary>
/// 序列化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <returns></returns>
private void SerializationButton_Click(object sender, EventArgs e)
{
// log属性
XAttributeMap xLogAttributeMap = new XAttributeMapImpl();
xLogAttributeMap.put("lifecycle:model", new XAttributeLiteralImpl("lifecycle:model", "standard", XLifecycleExtension.instance()));
xLogAttributeMap.put("creator", new XAttributeLiteralImpl("creator", "Gilbert"));
xLogAttributeMap.put("library", new XAttributeLiteralImpl("library", "OpenXes v1.9"));
XLog xLog = new XLogImpl(xLogAttributeMap);
// 扩展
Set extensions = xLog.getExtensions();
extensions.add(XConceptExtension.instance());
extensions.add(XLifecycleExtension.instance());
extensions.add(XTimeExtension.instance());
// trace全局属性
List globalTraceAttributes = xLog.getGlobalTraceAttributes();
XAttribute traceNameAttribute = new XAttributeLiteralImpl("concept:name", "name", XConceptExtension.instance());
globalTraceAttributes.add(traceNameAttribute);
// event全局属性
List globalEventAttributes = xLog.getGlobalEventAttributes();
XAttribute eventNameAttribute = new XAttributeLiteralImpl("concept:name", "name", XConceptExtension.instance());
globalEventAttributes.add(eventNameAttribute);
XAttribute eventTransitionAttribute = new XAttributeLiteralImpl("lifecycle:transition", "transition", XLifecycleExtension.instance());
globalEventAttributes.add(eventTransitionAttribute);
XAttribute eventTimestampAttribute = new XAttributeTimestampImpl("time:timestamp",
new Date((long)((DateTime.Parse("2013-05-08T13:47:39.418+08:00") - DateTime.Parse("1970-1-1T00:00:00+0:00")).TotalMilliseconds)), XTimeExtension.instance());
globalEventAttributes.add(eventTimestampAttribute);
XAttribute eventActivityName = new XAttributeLiteralImpl("活动名称", "string");
// 分类器
List classifiers = xLog.getClassifiers();
XEventClassifier activityClassifier = new XEventAttributeClassifier("Activity", new string[] { "活动名称" });
classifiers.add(activityClassifier);
// 第一个trace
XAttributeMap xTraceAttributeMap = new XAttributeMapImpl();
xTraceAttributeMap.put("concept:name", new XAttributeLiteralImpl("concept:name", "152422866DE588B44825794A000D90E2", XConceptExtension.instance()));
xTraceAttributeMap.put("creator", new XAttributeLiteralImpl("creator", "Gilbert"));
XTrace xTrace = new XTraceImpl(xTraceAttributeMap);
xLog.add(xTrace);
// 第一个trace的event
XAttributeMap xEventAttributeMap = new XAttributeMapImpl();
xEventAttributeMap.put("concept:name", new XAttributeLiteralImpl("concept:name", "登记", XConceptExtension.instance()));
xEventAttributeMap.put("lifecycle:transition", new XAttributeLiteralImpl("lifecycle:transition", "start", XLifecycleExtension.instance()));
xEventAttributeMap.put("time:timestamp", new XAttributeTimestampImpl("time:timestamp",
new Date((long)((DateTime.Parse("2011-10-11T09:29:37.000+08:00") - DateTime.Parse("1970-1-1T00:00:00+0:00")).TotalMilliseconds)),
XTimeExtension.instance()));
xEventAttributeMap.put("活动名称", new XAttributeLiteralImpl("活动名称", "登记"));
XEvent xEvent = new XEventImpl(xEventAttributeMap);
xTrace.add(xEvent);
#region 向xTrace添加其它Event,过程类似,用于测试输出结果
AddEventsToTrace(ref xTrace, "登记", "complete", "2011-10-11T09:35:10.000+08:00", "登记");
AddEventsToTrace(ref xTrace, "部门领导批示", "start", "2011-10-11T09:35:10.000+08:00", "部门领导批示");
AddEventsToTrace(ref xTrace, "部门领导批示", "complete", "2011-10-11T09:41:43.000+08:00", "部门领导批示");
AddEventsToTrace(ref xTrace, "部门落实", "start", "2011-10-11T09:41:43.000+08:00", "部门落实");
AddEventsToTrace(ref xTrace, "财务落实", "start", "2011-10-11T09:41:43.000+08:00", "财务落实");
AddEventsToTrace(ref xTrace, "部门落实", "complete", "2011-10-11T10:12:32.000+08:00", "部门落实");
AddEventsToTrace(ref xTrace, "财务落实", "complete", "2011-10-13T09:00:58.000+08:00", "财务落实");
#endregion
#region 向xLog添加其它Trace,过程类似,用于测试输出结果
AddTraceToLog(ref xLog);
#endregion
XesXmlSerializer xesSerializer = new XesXmlSerializer();
java.io.File xesFile = new java.io.File("d:\\test.xes");
java.io.OutputStream xesStream = new java.io.FileOutputStream(xesFile);
xesSerializer.serialize(xLog, xesStream);
MessageBox.Show("序列化结束");
}
/// <summary>
/// 向xTrace添加Event,用于测试序列化结果
/// </summary>
/// <param name="xTrace"></param>
/// <param name="name"></param>
/// <param name="transition"></param>
/// <param name="timeString"></param>
/// <param name="activityName"></param>
/// <returns></returns>
void AddEventsToTrace(ref XTrace xTrace, string name, string transition, string timeString, string activityName)
{
XAttributeMap xEventAttributeMap = new XAttributeMapImpl();
xEventAttributeMap.put("concept:name", new XAttributeLiteralImpl("concept:name", name, XConceptExtension.instance()));
xEventAttributeMap.put("lifecycle:transition", new XAttributeLiteralImpl("lifecycle:transition", transition, XLifecycleExtension.instance()));
xEventAttributeMap.put("time:timestamp", new XAttributeTimestampImpl("time:timestamp",
new Date((long)((DateTime.Parse(timeString) - DateTime.Parse("1970-1-1T00:00:00+0:00")).TotalMilliseconds)),
XTimeExtension.instance()));
xEventAttributeMap.put("活动名称", new XAttributeLiteralImpl("活动名称", activityName));
XEvent xEvent = new XEventImpl(xEventAttributeMap);
xTrace.add(xEvent);
}
void AddTraceToLog(ref XLog xLog)
{
XAttributeMap xTraceAttributeMap = new XAttributeMapImpl();
xTraceAttributeMap.put("concept:name", new XAttributeLiteralImpl("concept:name", "152422866DE588B44825794A000D90E3", XConceptExtension.instance()));
xTraceAttributeMap.put("creator", new XAttributeLiteralImpl("creator", "Gilbert"));
XTrace xTrace = new XTraceImpl(xTraceAttributeMap);
xLog.add(xTrace);
AddEventsToTrace(ref xTrace, "登记", "start", "2012-10-11T09:29:37.000+08:00", "登记");
AddEventsToTrace(ref xTrace, "登记", "complete", "2012-10-11T09:35:10.000+08:00", "登记");
AddEventsToTrace(ref xTrace, "部门领导批示", "start", "2012-10-11T09:35:10.000+08:00", "部门领导批示");
AddEventsToTrace(ref xTrace, "部门领导批示", "complete", "2012-10-11T09:41:43.000+08:00", "部门领导批示");
AddEventsToTrace(ref xTrace, "部门落实", "start", "2012-10-11T09:41:43.000+08:00", "部门落实");
AddEventsToTrace(ref xTrace, "财务落实", "start", "2012-10-11T09:41:43.000+08:00", "财务落实");
AddEventsToTrace(ref xTrace, "部门落实", "complete", "2012-10-11T10:12:32.000+08:00", "部门落实");
AddEventsToTrace(ref xTrace, "财务落实", "complete", "2012-10-13T09:00:58.000+08:00", "财务落实");
}
}
上述代码中,84行,向trace添加event,97行,向log添加trace。上面的代码编译运行后生成下面的XES文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- This file has been generated with the OpenXES library. It conforms -->
<!-- to the XML serialization of the XES standard for log storage and -->
<!-- management. -->
<!-- XES standard version: 1.0 -->
<!-- OpenXES library version: 1.0RC7 -->
<!-- OpenXES is available from http://www.openxes.org/ -->
<log xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7" xmlns="http://www.xes-standard.org/">
<extension name="Lifecycle" prefix="lifecycle" uri="http://www.xes-standard.org/lifecycle.xesext"/>
<extension name="Time" prefix="time" uri="http://www.xes-standard.org/time.xesext"/>
<extension name="Concept" prefix="concept" uri="http://www.xes-standard.org/concept.xesext"/>
<global scope="trace">
<string key="concept:name" value="name"/>
</global>
<global scope="event">
<string key="concept:name" value="name"/>
<string key="lifecycle:transition" value="transition"/>
<date key="time:timestamp" value="2013-05-08T13:47:39.418+08:00"/>
</global>
<classifier name="Activity" keys="活动名称"/>
<string key="library" value="OpenXes v1.9"/>
<string key="lifecycle:model" value="standard"/>
<string key="creator" value="Gilbert"/>
<trace>
<string key="creator" value="Gilbert"/>
<string key="concept:name" value="152422866DE588B44825794A000D90E2"/>
<event>
<date key="time:timestamp" value="2011-10-11T09:29:37+08:00"/>
<string key="concept:name" value="登记"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="登记"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T09:35:10+08:00"/>
<string key="concept:name" value="登记"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="登记"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T09:35:10+08:00"/>
<string key="concept:name" value="部门领导批示"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="部门领导批示"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T09:41:43+08:00"/>
<string key="concept:name" value="部门领导批示"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="部门领导批示"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T09:41:43+08:00"/>
<string key="concept:name" value="部门落实"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="部门落实"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T09:41:43+08:00"/>
<string key="concept:name" value="财务落实"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="财务落实"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-11T10:12:32+08:00"/>
<string key="concept:name" value="部门落实"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="部门落实"/>
</event>
<event>
<date key="time:timestamp" value="2011-10-13T09:00:58+08:00"/>
<string key="concept:name" value="财务落实"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="财务落实"/>
</event>
</trace>
<trace>
<string key="creator" value="Gilbert"/>
<string key="concept:name" value="152422866DE588B44825794A000D90E3"/>
<event>
<date key="time:timestamp" value="2012-10-11T09:29:37+08:00"/>
<string key="concept:name" value="登记"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="登记"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T09:35:10+08:00"/>
<string key="concept:name" value="登记"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="登记"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T09:35:10+08:00"/>
<string key="concept:name" value="部门领导批示"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="部门领导批示"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T09:41:43+08:00"/>
<string key="concept:name" value="部门领导批示"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="部门领导批示"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T09:41:43+08:00"/>
<string key="concept:name" value="部门落实"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="部门落实"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T09:41:43+08:00"/>
<string key="concept:name" value="财务落实"/>
<string key="lifecycle:transition" value="start"/>
<string key="活动名称" value="财务落实"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-11T10:12:32+08:00"/>
<string key="concept:name" value="部门落实"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="部门落实"/>
</event>
<event>
<date key="time:timestamp" value="2012-10-13T09:00:58+08:00"/>
<string key="concept:name" value="财务落实"/>
<string key="lifecycle:transition" value="complete"/>
<string key="活动名称" value="财务落实"/>
</event>
</trace>
</log>