Python 中的 DATEXII XML 文件到 DataFrame

2024-03-16

最近几天我一直在尝试打开并读取某个 XML 文件(DATEXII 格式),但到目前为止还没有成功。这是关于交通数据NDW 开放数据网站 http://83.247.110.3/OpenDataHistorie(荷兰道路和交通数据数据库),XML 文件源的超链接。树的头就像在这幅图片中 https://i.stack.imgur.com/iwhqJ.png并继续像这样 https://i.stack.imgur.com/nfZ9v.png,另请参阅下面的代码片段。尽管这些加在一起只构成数据的很小一部分。

<?xml version="1.0"?> -
<soapenv:Envelope xmlns:_0="http://datex2.eu/schema/2/2_0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header/> -
  <soapenv:Body>
    -
    <d2LogicalModel modelBaseVersion="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      -
      <exchange xmlns="http://datex2.eu/schema/2/2_0">
        -
        <supplierIdentification>
          <country>nl</country>
          <nationalIdentifier>NLNDW</nationalIdentifier>
        </supplierIdentification>
      </exchange>
      -
      <payloadPublication lang="nl" xmlns="http://datex2.eu/schema/2/2_0" xsi:type="MeasuredDataPublication">
        <publicationTime>2017-10-30T05:00:40.007Z</publicationTime>
        -
        <publicationCreator>
          <country>nl</country>
          <nationalIdentifier>NLNDW</nationalIdentifier>
        </publicationCreator>
        <measurementSiteTableReference targetClass="MeasurementSiteTable" version="955" id="NDW01_MT" /> -
        <headerInformation>
          <confidentiality>noRestriction</confidentiality>
          <informationStatus>real</informationStatus>
        </headerInformation>
        -
        <siteMeasurements>
          <measurementSiteReference targetClass="MeasurementSiteRecord" version="1" id="PZH01_MST_0690_00" />
          <measurementTimeDefault>2017-10-30T04:59:00Z</measurementTimeDefault>
          -
          <measuredValue index="1">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficFlow">
                -
                <vehicleFlow>
                  <vehicleFlowRate>60</vehicleFlowRate>
                </vehicleFlow>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="2">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficFlow">
                -
                <vehicleFlow>
                  <vehicleFlowRate>0</vehicleFlowRate>
                </vehicleFlow>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="3">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficFlow">
                -
                <vehicleFlow>
                  <vehicleFlowRate>0</vehicleFlowRate>
                </vehicleFlow>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="4">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficFlow">
                -
                <vehicleFlow>
                  <vehicleFlowRate>60</vehicleFlowRate>
                </vehicleFlow>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="5">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficSpeed">
                -
                <averageVehicleSpeed numberOfInputValuesUsed="1">
                  <speed>38</speed>
                </averageVehicleSpeed>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="6">
            -
            <measuredValue>
              -
              <basicData xsi:type="TrafficSpeed">
                -
                <averageVehicleSpeed numberOfInputValuesUsed="0">
                  <speed>-1</speed>
                </averageVehicleSpeed>
              </basicData>
            </measuredValue>
          </measuredValue>
          -
          <measuredValue index="7">

理想情况下,我希望使用 Python 将信息作为 DataFrame 加载到 Jupyter Notebook 中,这样如果数据允许,我可以执行一些预测分析。我已经尝试过使用 ElementTree,像这样的 lxml,受到许多其他线程的启发:

# Standard Packages
import pandas as pd
import numpy as np

# Necessary Packages for XML and setting Working Directory
import os
import xml.etree.ElementTree as ET
import lxml

os.chdir("C:/.../Intensiteiten en snelheden/30-10-2017")

xml_file = open('0600_Trafficspeed.xml').read() # Unzipped the file manually

def xml2df(xml_data):
    root = ET.XML(xml_data) # element tree
    all_records = [] #This is our record list which we will convert into a 
    dataframe
    for i, child in enumerate(root): #Begin looping through our root tree
        record = {} #Place holder for our record
        for subchild in child: #iterate through the subchildren
            record[subchild.tag] = subchild.text #Extract the text create a new 
    dictionary key, value pair
        all_records.append(record) #Append this record to all_records.
return pd.DataFrame(all_records) #return records as DataFrame

print(xml2df(xml_file))

尽管这仅返回第一行的一个条目,例如列名:d2LogicalModel,行:0,条目:None。

我在 Microsoft Edge 中很难看到树状结构,需要大量 CPU(Notepad++ 和插件 XMLtools 也足够了,但会因“更大”大小的文件(即 > 20mb)而崩溃)。不过,在我看来,这种结构仍然难以理解。层数太多,不知道如何定义xml2df()与正确的子子等。

因此,我的问题归结为,首先,我如何能够识别带有数据的变量/列?借此了解我想要导入的相关数据的概述。其次,如何将其导入到 DataFrame 中?

Note: 由于 DATEXII 格式是欧洲交通数据的标准,我希望他们的指南能有所帮助(请参阅文件 http://www.datex2.eu/archived-document/37),但它们对我来说还没有意义。也许他们会对你们中的任何一个人感兴趣:)

任何帮助是极大的赞赏!


考虑使用以下命令将嵌套的 XML 输入源转换为更扁平的结构XSLT https://www.w3.org/Style/XSL/专用转换语言,旨在将 XML 文件转换为其他 XML、HTML,甚至文本 (CSV/TAB)。因此,考虑下面的 XSLT,它将原始 XML 转换为表格格式的逗号分隔值,以便导入到 pandas 中:read_csv():

XSLT (另存为.xsl文件,一种特殊的xml文件)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                              xmlns:pub="http://datex2.eu/schema/2/2_0"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/soapenv:Envelope">
    <xsl:text>publicationTime,country,nationalIdentifier,msmtSiteTableRef_targetClass,msmtSiteTableRef_version,msmtSiteTableRef_id,</xsl:text>
    <xsl:text>msmtSiteRef_targetClass,msmtSiteRef_version,msmtSiteRef_id,measurementTimeDefault,</xsl:text>
    <xsl:text>measuredValue_index,basicData_type,vehicleFlowRate,averageVehicleSpeed_numberOfInputValues,averageVehicleSpeed_value</xsl:text>
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="soapenv:Body"/>
  </xsl:template>

  <xsl:template match="soapenv:Body">
    <xsl:apply-templates select="d2LogicalModel"/>
  </xsl:template>

  <xsl:template match="d2LogicalModel">
    <xsl:apply-templates select="pub:payloadPublication"/>
  </xsl:template>

  <xsl:template match="pub:payloadPublication">
    <xsl:apply-templates select="pub:siteMeasurements"/>
  </xsl:template>

  <xsl:template match="pub:siteMeasurements">
    <xsl:apply-templates select="pub:measuredValue"/>
  </xsl:template>

  <xsl:template match="pub:measuredValue">
    <xsl:value-of select="concat(ancestor::pub:payloadPublication/pub:publicationTime,',',
                                 ancestor::pub:payloadPublication/pub:publicationCreator/pub:country,',',
                                 ancestor::pub:payloadPublication/pub:publicationCreator/pub:nationalIdentifier,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@targetClass,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@version,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@id,',',
                                 ancestor::pub:payloadPublication/pub:siteMeasurements/pub:measurementSiteReference/@targetClass,',',
                                 ancestor::pub:payloadPublication/pub:siteMeasurements/pub:measurementSiteReference/@version,',',
                                 ancestor::pub:payloadPublication/pub:siteMeasurements/pub:measurementSiteReference/@id,',',
                                 ancestor::pub:siteMeasurements/pub:measurementTimeDefault,',',
                                 @index,',',
                                 pub:measuredValue/pub:basicData/@xsi:type,',',
                                 descendant::pub:vehicleFlowRate,',',
                                 descendant::pub:averageVehicleSpeed/@numberOfInputValuesUsed,',',
                                 descendant::pub:speed)"/><xsl:text>&#xa;</xsl:text>    
  </xsl:template>

</xsl:stylesheet>

Python

from io import StringIO
import lxml.etree as et
import pandas as pd

# LOAD XML AND XSL FILES
doc = et.parse('/path/to/Input.xml')
xsl = et.parse('/path/to/XSLT.xsl')

# INITIALIZE AND RUN TRANSFORMATION
transform = et.XSLT(xsl)
# CONVERT RESULT TO STRING 
result = str(transform(doc))

# IMPORT INTO DATAFRAME
df = pd.read_csv(StringIO(result))

Output (父节点值成为具有不同数值数据的重复指标)

print(df)

#           publicationTime country nationalIdentifier msmtSiteTableRef_targetClass  msmtSiteTableRef_version msmtSiteTableRef_id msmtSiteRef_targetClass  msmtSiteRef_version     msmtSiteRef_id measurementTimeDefault  measuredValue_index basicData_type  vehicleFlowRate  averageVehicleSpeed_numberOfInputValues  averageVehicleSpeed_value
# 0  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    1    TrafficFlow             60.0                                      NaN                        NaN
# 1  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    2    TrafficFlow              0.0                                      NaN                        NaN
# 2  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    3    TrafficFlow              0.0                                      NaN                        NaN
# 3  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    4    TrafficFlow             60.0                                      NaN                        NaN
# 4  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    5   TrafficSpeed              NaN                                      1.0                       38.0
# 5  20171030T05:00:40.007Z      nl              NLNDW         MeasurementSiteTable                       955            NDW01_MT   MeasurementSiteRecord                    1  PZH01_MST_0690_00     20171030T04:59:00Z                    6   TrafficSpeed              NaN                                      0.0                        1.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的 DATEXII XML 文件到 DataFrame 的相关文章

随机推荐

  • 我可以编写一个 CSS 选择器来选择不具有特定类或属性的元素吗?

    我想编写一个 CSS 选择器规则来选择所有元素don t有一定的班级 例如 给定以下 HTML h1 class printable Example h1
  • React-Native:哪种自动化 CI 工具最好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 React Native 社区 你们使用什么 CI 工具 我们的团队构建了一个react native ios应用程序 我们还有一个单独的测试团
  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • 如果 URL 是 https,Python urllib2 会给出“网络无法访问错误”

    我正在尝试使用 urllib2 库获取一些网址 a urllib2 urlopen http www google com ret a read 上面的代码工作正常 并给出了预期的结果 但是当我创建 url https 时 它会给出 网络无
  • 将文本插入活动迷你缓冲区

    我试图在运行外部命令后将文本插入到迷你缓冲区中 例如 call interactively eval expression insert blah 当然 问题是 eval expression 在用户输入之前不会返回 我的最终目标是添加一些
  • Xcode 6:项目导航器中没有 Frameworks 文件夹

    我正在使用 Xcode 6 并遵循 Xcode 版本 4 教程 因此这里和那里的情况有所不同 我的项目导航器中似乎没有 Frameworks 文件夹 因此当我下载一些 framework 文件并在项目编辑器的构建阶段手动添加它们时 我没有
  • HttpUtility.UrlEncoded URL 段的错误请求 400

    因此 如果我的应用程序 MVC url 中存在 url 编码段 则 IIS 会抛出 BAD REQUEST 400 e g http u lasoo com au Offer http u lasoo com au Offer 9289 7
  • json 从遗留属性名称反序列化

    如何设置 Newtonsoft Json 使用旧成员名称反序列化对象 但使用当前成员名称序列化它 编辑 要求是从正在序列化 反序列化的类中删除过时的成员 这是一个需要序列化和反序列化的示例对象 我给了一个属性一个属性 其中包含它过去可能已序
  • 将字典转换为方阵

    我想学习如何将字典转换为方阵 根据我所读到的内容 我可能需要将其转换为 numpy 数组 然后重新调整它的形状 我不想使用 reshape 因为我希望能够根据用户输入的信息来执行此操作 换句话说 我希望代码能够给出一个方阵 无论用户输入了多
  • 必须重新验证此请求的标头错误吗?

    我注意到 Chrome 缓存了一个视频文件 我用服务器上的另一个替换了它 chrome 继续从缓存中提供旧的 使用 JW flash 播放器 5 请求的标头如下所示 joe joe desktop wget O S spider http
  • 为什么这个 MySQL 查询的结果会相互相乘?

    SELECT user id SUM COALESCE point points 0 AS total points SUM CASE WHEN point date gt this month THEN point points ELSE
  • 在 Flutter 中以编程方式扩展 ExpansionTile

    我只是想用ExpansionTile在 Flutter 中 我将示例修改为如下所示 我想隐藏箭头并使用Switch扩大瓷砖 可以吗 或者我是否需要以编程方式呈现子项的自定义小部件 基本上 我只需要显示 隐藏孩子们 这是我的代码 import
  • 如何在 bash 脚本中重新组织 sed 正则表达式中的嵌套引号,从而触发“未终止的替代模式”错误?

    以下命令抛出一个unterminated substitute patternbash 中的错误 eval echo sed s a u a z n n 1 但并不适合所有人 Linux 显然运行良好 Mac 抛出未终止的替代模式错误 我该
  • 骨干获取回调的正确方法

    我的 Backbone 应用程序有一个名为schedule 我对成功和错误调用正确函数的区别有点困惑 我尝试了下面列出的两种可能的方法 但我不知道有什么区别以及从放置的路由器调用函数的正确方法是什么在外部视图中 第一种方式 require
  • 使用OpenGL和GLFW的简单三角形[重复]

    这个问题在这里已经有答案了 我编写了一个小程序来使用顶点缓冲区显示一个简单的三角形 对于我使用 glfw 的窗口 我的环境是 Mac 10 9 XCode 5 窗口看起来是黑色的 但三角形不是油漆 这里是代码 include
  • 除应用内支付之外的 iOS 支付网关

    我有一个iPhone应用程序 其中有在线支付功能 对于付款 我想使用我自己的网站上的支付网关 这样我就可以将用户重定向到网站进行付款 谁能帮我 苹果会允许这个功能吗 任何帮助或建议将不胜感激 提前致谢 苹果允许第三方支付网关系统 Strip
  • java.lang.NoClassDefFoundError:无法初始化类 hudson.util.ProcessTree$UnixReflection

    我在尝试使用 Jenkins 构建项目时遇到了这个问题 java lang NoClassDefFoundError 无法初始化类 hudson util ProcessTree UnixReflection java lang NoCla
  • 使用 multer 和 gridfs 快速上传文件(文件损坏?)

    我正在尝试上传文件 图像 上传正常 文件存储在 Mongo 中 并且与原始文件具有相同的内容类型和大小 然后当我尝试下载它时 文件已损坏但保持相同的内容类型 如果我上传pdf 它会被识别为pdf 如果它是png 它也会被识别 但我无法打开它
  • 在 Web 服务器上部署可执行进程的最佳方法是什么?

    原问题 这个问题的标题可能措辞有点笨拙 但情况是这样的 我的服务器上部署了一个 NET Web 项目 它仍处于测试阶段 因此有很多发布和重新发布的情况发生 我还在同一个 VS 解决方案中编写了一个 C 可执行文件 称为 admin exe
  • Python 中的 DATEXII XML 文件到 DataFrame

    最近几天我一直在尝试打开并读取某个 XML 文件 DATEXII 格式 但到目前为止还没有成功 这是关于交通数据NDW 开放数据网站 http 83 247 110 3 OpenDataHistorie 荷兰道路和交通数据数据库 XML 文