从XML文件创建电子表格

时间:2010-03-30 13:46:04

标签: xml r statistics stata

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

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

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

2 个答案:

答案 0 :(得分:5)

一般而言,您似乎需要更多的XML概念帮助,而不是使用特定的R包和片段来处理XML文件(尽管这可能会在以后出现;-))。此外,您可能会发现最好在之前将输入文件转换为更适合的格式,以便在R,Stata或其他统计工具中使用它。

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

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

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

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

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

从哪里去?

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

幸运的是,你很快就可以完成这个转换/导入工作,并专注于手头的统计数据!

最后一点指示:

  • 即使您不易理解DTD语言,也请查看XTD文件,特别是包含大量文件的许多<xs:enumeration ...>列表,因为它们将为您提供因子(在R lingo中)的值。当然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>

答案 1 :(得分:1)

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

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