1

我正在尝试将一个 120mb 的恐怖事件 XML 数据库(可在此处下载的第一个文件http://wits.nctc.gov/Export.do)转换为电子表格形式,以便我可以将其与其他数据合并并进行统计分析。

到目前为止,我一直在使用 Stata,它现在没用了,因为它不会读取 XML。该网站按月提供较小的文件,可以通过 excel 打开,但 excel 不会以我想要的形式显示它们,应该有更好的方法来转换完整的文件,而不是打开一百多个单个文件,手动保存它们制表符分隔然后合并它们。

我正在寻找一种将完整的 WITS.xml 文件转换为电子表格的方法,其中一行代表单个恐怖事件,并且不应丢失 xml 中的任何信息。即使是结构不同的 XML 也可能没问题。我尝试过转换器,但它们要么不是免费的,要么不按我想要的方式执行,要么文件太大,而且我不知道如何使用 xslt。我正在学习经济学,而我的编程知识几乎不存在,这越来越成为一个缺点。我已经看到有一个我可以使用的 R 包,也许现在是开始学习 R 或其他语言的合适时机。但是,如果有一种快速简便的方法可以做到这一点,我肯定会更喜欢它。

4

2 回答 2

5

通常,与处理 XML 文件的特定 R 包和片段相比,您似乎需要更多有关 XML 概念的帮助(尽管这可能会在以后出现;-))。此外,您可能会发现在 R、Stata 或其他统计工具中使用输入文件之前,最好将其转换为更可口的格式。

出于说明目的,我<incident>从问题中提到的来源复制了第一条记录。我们可以假设其他事件将具有类似的结构。通过查看 DTD 文件,我们可以断言根是否包含其他节点(“记录”),<incidents>以及这些事件是否具有完全相同的结构(或者例如某些事件类型可能有额外的节点,例如<LocalWeatherConditions>节点,或者如果,比如说,<facilityList>节点是可选的)。出于本讨论的目的,可以假设所有事件记录具有相同的一般结构。

由于基数问题,您对“其中一行代表单个恐怖事件,并且不应丢失 xml 中的任何信息”的电子表格的请求可能难以实现。这是一种奇特的说法,即事件记录的某些子元素可能会重复。例如,大多数名称以“列表”结尾的节点通常可以包含多个子记录(顺便说一句,这个“名称中的列表”不是 XML 规则,只是该特定数据库的保管人使用的约定) . 例如,可能有多个<CityStateProvince>记录,每个记录都有自己的值,分别代表 City 和 StateProvince,或者可能有多个 ` 记录,每个记录都有其长长的值列表。
可以将数据“展平”成单行。一般过程是“非规范化”之一,其中单行包括带有编号标签的列:

  ..., City1, StateProv1, City2, StateProv2, City3, StateProv3 ... (btw where do we stop?)

此外,除了导致可能超出基础语言(绝对或实际)限制的广泛记录之外,这种格式在聚合和执行总体统计方面非常麻烦:假设您希望通过 StateProv 获得计数:您现在需要指示程序“查看”找到此信息的所有可能位置:“StateProv1”、“StateProv2”...

另一种更适合统计处理的格式是导出到多个“电子表格”。其中一个主电子表格包含每个事件的一行,用于事件记录的所有不可重复属性,而附加电子表格包含可能重复的“子记录”。这些子记录应包括一个“键”,可用于与主电子表格(可能是 ICN,此处)中的基础记录相关,它们还可能包括来自主电子表格的重复信息,例如引入 IncidateDate , Assanination 标志等。这种非规范化[另一种]的目的可能是使这些额外的电子表格足以满足某些目标分析。

从那里去哪里?

  • 您需要定义从 XML 输入生成的电子表格的精确格式。
    您可能会同意编号标签方法不切实际的事实,因此您需要查看输入数据并查看您希望如何拆分它(再次具有复制数据的能力)。
  • 您可以使用 R 例如此XML 包将输入解析为 R 变量(表、列表、向量...)
  • 或者,您可以(我认为应该)使用外部程序将 XML 输入导出为表格形式(CSV 格式等),这更容易被 R 摄取。
    虽然我使用提到的 XML 包,对于小文件(并且主要用于输出目的),我担心它可能效率低下,容易出错(您缺乏轻松检查有效输入的能力,就像使用文本文件一样),而且通常很笨拙。

幸运的是,您很快就能完成转换/导入工作,专注于手头的统计数据!

最后的几点建议:

  • 即使您不太了解 DTD 语言,也请查看 XTD 文件,尤其是<xs:enumeration ...>构成文件大部分内容的许多列表,因为这些列表将为您提供因子(用 R 术语表示)值。当然,R 也可以从数据中推断出这些,但是您可以使用枚举中的信息来进行交叉引用(以确认数据是先验加载正确等)

  • 几个记录样本中推断模式可能是可以的(不熟悉 XML 的人比 XSD 文件更容易理解 XML 数据)。然而,为了确保需要阅读 XSD 文件。


<IncidentList xmlns="http://wits.nctc.gov" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://wits.nctc.gov WITS.XSD">

<Incident>
   <ICN>200458431</ICN>
   <Subject>10 civilians killed, at least 45 wounded by suspected GAM in Peureulak, Indonesia</Subject>
   <Summary>On 1 January 2004, in Peureulak, Aceh Province, Indonesia, a bomb exploded at a concert, killing ten civilians, wounding 45 others, and causing major damage to the stage area.  Many of the victims were Indonesian teenagers.  Police blamed the Free Aceh Movement (GAM), although the GAM denied responsibility.  No other group claimed responsibility.</Summary>
   <IncidentDate>01/01/2004</IncidentDate>
   <ApproximateDate>No</ApproximateDate>
   <MultipleDays>No</MultipleDays>
   <EventTypeList>
      <EventType>Bombing</EventType>
   </EventTypeList>
   <Assassination>No</Assassination>
   <Suicide>No</Suicide>
   <WeaponTypeList>
       <WeaponType>Explosive</WeaponType>
   </WeaponTypeList>
   <IED>No</IED>
   <Location>
      <Region>East Asia-Pacific</Region>
      <Country>Indonesia</Country>
      <CityStateProvinceList>
         <CityStateProvince>
            <City>Peureulak</City>
            <StateProvince>Aceh</StateProvince>
         </CityStateProvince>
      </CityStateProvinceList>
   </Location>
   <VictimList>
      <Victim>
      <VictimType>Civilian</VictimType>
      <Combatant>No</Combatant>
      <Nationality>Indonesia</Nationality>
      <DefiningCharacteristicList>
         <DefiningCharacteristic>None</DefiningCharacteristic>
      </DefiningCharacteristicList>
      <TargetedCharacteristicList>
         <TargetedCharacteristic>Unknown</TargetedCharacteristic>
      </TargetedCharacteristicList>
      <Indicator>Targeted</Indicator>
      <Child>No</Child>
      <DeadCount>10</DeadCount>
      <WoundedCount>45</WoundedCount>
      <HostageCount>0</HostageCount>
      </Victim>
   </VictimList>
   <FacilityList>
      <Facility>
         <FacilityType>Public Place/Retail</FacilityType>
         <Combatant>No</Combatant>
         <Nationality>Indonesia</Nationality>
         <DefiningCharacteristicList>
         <DefiningCharacteristic>None</DefiningCharacteristic>
         </DefiningCharacteristicList>
         <TargetedCharacteristicList>
         <TargetedCharacteristic>Unknown</TargetedCharacteristic>
         </TargetedCharacteristicList>
         <Indicator>Targeted</Indicator>
         <Damage>Light</Damage>
         <Quantity>1</Quantity>
      </Facility>
   </FacilityList>
   <PerpetratorList>
      <Perpetrator>
         <Nationality>Indonesia</Nationality>
         <Characteristic>Secular/Political/Anarchist</Characteristic>
      </Perpetrator>
   </PerpetratorList>
</Incident>
[...]
</IncidentList>
于 2010-03-30T15:47:49.267 回答
1

我已经开始使用名为Talend Open Studio的开源产品来执行这些提取/转换/加载任务。它是一个基于 GUI 的代码生成工具,可输出到可移植的 Perl 或 Java,并带有与数据库和文件类型的大量连接。

这需要一个学习曲线;做一些更复杂的任务并不完全直观。但是,我怀疑将其配置为读取您的 XML 并输出到 XLS 会相当快速和容易。

于 2010-03-30T14:02:59.213 回答