如何将 XML 文件(在本例中为业务流程事件日志)导入和查询到 SQL Server Express?

Posted

技术标签:

【中文标题】如何将 XML 文件(在本例中为业务流程事件日志)导入和查询到 SQL Server Express?【英文标题】:How can I import and query an XML file (in this case, a business process event log) into SQL Server Express? 【发布时间】:2016-02-12 10:55:27 【问题描述】:

为了简短起见,我有这个“.xes”(可扩展事件流)文件,它实际上是一个 XML,看起来像这样(这段代码只显示了一个事件的示例 - 该文件包含多个类似的事件到这个):

<?xml version="1.0" encoding="UTF-8" ?>
<log xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7" xmlns="http://www.xes-standard.org/">
    <trace>
        <string key="concept:name" value="0"/>
        <event>
            <string key="org:resource" value="Call Centre Agent"/>
            <date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00"/>
            <string key="concept:name" value="check if sufficient information is available"/>
            <string key="lifecycle:transition" value="start"/>
        </event>
     </trace>
...

这个文件实际上代表了一个业务流程事件日志,其中包含一个流程的不同活动的事件,带有时间戳和更多信息。

我需要从这些数据中提取信息并准备一些 SQL 查询。

我目前使用的是 SQL Server 2014 Express 数据库,在导入和查询数据时遇到问题。

【问题讨论】:

会不会有不止一个事件? 是的,有很多事件,类似这个。我只复制了一个作为示例。 你应该真正考虑这些事情之前你问...我会编辑我的答案 【参考方案1】:

这是将文件内容放入变量的一般方法: 这是将文件内容放入变量的一般方法:

DECLARE @xml XML=
(SELECT *  FROM OPENROWSET(BULK 'C:\YourPath\XMLFile.xml',SINGLE_CLOB) AS x);
SELECT @xml;

因为这是嵌套数据(嵌套级别不明确......)这是我的建议:

DECLARE @log XML=
'<log xmlns="http://www.xes-standard.org/" xes.version="1.0" xes.features="nested-attributes" openxes.version="1.0RC7">
  <trace>
    <string key="concept:name" value="0" />
    <event>
      <string key="org:resource" value="Call Centre Agent" />
      <date key="time:timestamp" value="2006-01-01T00:00:00.000+01:00" />
      <string key="concept:name" value="check if sufficient information is available" />
      <string key="lifecycle:transition" value="start" />
    </event>
    <event>
      <string key="second-resouce" value="Call Centre Agent" />
      <date key="second:timestamp" value="2006-01-01T00:00:00.000+01:00" />
      <string key="second:name" value="check if sufficient information is available" />
      <string key="second:transition" value="start" />
    </event>
  </trace>
</log>';

WITH XMLNAMESPACES(DEFAULT 'http://www.xes-standard.org/')
SELECT TraceNode.value('string[1]/@key','varchar(max)') AS Trace_String_Key
      ,TraceNode.value('string[1]/@value','int') AS Trace_String_Value
      ,EventNode.value('date[1]/@key','varchar(max)') AS Trace_Event_Date_Key
      ,EventNode.value('date[1]/@value','datetime') AS Trace_Event_Date_Value
      ,EventStringNode.value('@key','varchar(max)') AS Trace_Event_String_Key
      ,EventStringNode.value('@value','varchar(max)') AS Trace_Event_String_Value

FROM @log.nodes('/log/trace') AS a(TraceNode)
OUTER APPLY TraceNode.nodes('event') AS b(EventNode)
OUTER APPLY EventNode.nodes('string') AS c(EventStringNode)

你有什么建议吗?我可以查询这个吗? 数据?一些实际的例子会很有用

好吧,这完全取决于您...如果您提出这样的问题,您应该知道您需要它来做什么:-)

一个想法:

创建关系表结构

表“日志”(每个日志文件和辅助数据) 表“事件”(子数据到“日志”) 表“EventData”(子数据到“Event”)

您可以使用查询来检索您的数据以将其插入到您的表中...

【讨论】:

我确认,您的方法确实有效。谢谢!但是,您对我可以查询这些数据的方式和目的有什么建议吗?一些实际的例子会很有用。 @CCC 很高兴阅读,这对您有用!编辑了我的答案...请勾选接受检查(在投票柜台下方)以确认这一点。

以上是关于如何将 XML 文件(在本例中为业务流程事件日志)导入和查询到 SQL Server Express?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 的列表中保存对象(在本例中为玩家)?

将文本添加到道场图表(在本例中为散点图)

如何在 Linux 上的 C++ 程序中使用共享库(在本例中为 JsonCpp)?

java 读取必须使用特定字符集解码的文件(在本例中为UTF-16 LE)。

如何使用 C++ 在 Ubuntu 中连接到 ALSA 服务器(在本例中为 Timidity)?

csharp C#示例在外部文本编辑器应用程序(在本例中为记事本)中打开文本文件。