使用 ElementTree 读取 .xml 等电子表格

2024-02-07

我正在使用 ElementTree 读取 xml 文件,但有一个单元格无法读取其数据。

我调整了我的文件以制作一个可重现的示例,如下所示:

from xml.etree import ElementTree
import io

xmlf = """<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook ss:ResourcesPackageName="" ss:ResourcesPackageVersion="" xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="DigitalOutput" ss:IsDeviceType="true">
     <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">A</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
    <Cell><Data ss:Type="String">B</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
    <Cell><Data ss:Type="String">C</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
    <Cell ss:Index="7"><ss:Data ss:Type="String"
      xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">CAN'T READ </Font><Font>THIS</Font></ss:Data><NamedCell
      ss:Name="_FilterDatabase"/></Cell>
    <Cell ss:Index="10"><Data ss:Type="String">D</Data><NamedCell
      ss:Name="_FilterDatabase"/></Cell>
   </Row>
   </Worksheet>
 </Workbook>"""

ss = "urn:schemas-microsoft-com:office:spreadsheet"
worksheet_label = '{%s}Worksheet' % ss
row_label = '{%s}Row' % ss
cell_label = '{%s}Cell' % ss
data_label = '{%s}Data' % ss

tree = ElementTree.parse(io.StringIO(xmlf))
root = tree.getroot()

for ws in root.findall(worksheet_label):
    for table in ws.findall(row_label):
        for c in table.findall(cell_label):
            data = c.find(data_label)
            print(data.text)

输出是:

A
B
C
None
D

因此,第四个单元格未被读取。你能帮我解决这个问题吗?


Question:使用 ElementTree 读取 .xml 等电子表格

文档:lxml.etree 教程 - 命名空间 https://lxml.de/tutorial.html#namespaces


  1. 定义namespaces used

    ns = {'ss':"urn:schemas-microsoft-com:office:spreadsheet",
          'html':"http://www.w3.org/TR/REC-html40"
         }
    
  2. Use the namespaces with find(.../findall(...

    tree = ElementTree.parse(io.StringIO(xmlf))
    root = tree.getroot()
    
    for ws in root.findall('ss:Worksheet', ns):
        for table in ws.findall('ss:Row', ns):
            for c in table.findall('ss:Cell', ns):
                data = c.find('ss:Data', ns)
                if data.text is None:
                    text = []
                    data = data.findall('html:Font', ns)
                    for element in data:
                        text.append(element.text)
    
                    data_text = ''.join(text)
                    print(data_text)
                else:
                    print(data.text)
    

Output:

A
B
C
CAN'T READ THIS
D

使用 Python 测试:3.5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ElementTree 读取 .xml 等电子表格 的相关文章

随机推荐

  • MATLAB 的堆栈大小是多少?

    MATLAB R2018a 64 位 的默认堆栈大小是多少 堆栈大小似乎比 64 位 C 程序大 我为什么这么问 我问这个问题是因为我正在调用英特尔 MKL拉帕克 dtrtri https software intel com en us
  • 在java中修改复杂的csv文件

    我想编写一个可以打印和修改不规则csv文件的程序 格式如下 1 date 2 organization name 3 student name id number residence student name id number resid
  • 将视觉选择发送到外部程序而不影响缓冲区

    我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容 Example 让以下代码块代表当前缓冲区 让 代表视觉选择的结束 This is not a test 1 lt This is not gt a test 2 This is
  • YouTube 播放器.destroy();即使在验证玩家时也会抛出“this.a is null”

    所以我有一个带有两个面板的小应用程序 使用 iframe API 单击一个面板将全屏展开该面板 并显示 播放视频 按钮和一些附加信息 单击左上角的按钮将使 UI 返回到标准状态 关闭视频并将面板缩小到适合 50 50 现在我们有两个视频 我
  • 如何处理带有图像和文本视图的自定义列表视图中的图像视图的点击?

    我想知道我们如何处理带有图像和文本视图的自定义列表视图上的图像视图的点击 我什至使 Imageview 可点击 这是我的代码 自定义适配器 java public class CustomAdapter extends ArrayAdapt
  • 返回第一个表中的所有数据,如果存在则仅返回第二个表中的 1 个数据

    我正在使用MySql 我有 2 个表 一个是带有主键 propertyId 的名称和数据列表 表 2 包含具有主键 propertyImageId 的图像 每个 propertyId 可能有多个图像或根本没有图像 我需要获取属于agentI
  • SQL不是单组组函数

    当我运行以下 SQL 语句时 SELECT MAX SUM TIME FROM downloads GROUP BY SSN 它返回客户下载的最大总价值 但是如果我尝试通过将其添加到 select 语句来查找该最大值所属的社会安全号码 SE
  • C++ 使用 constexpr 和 lambda 表达式

    我正在看书C 17 完整指南 https rads stackoverflow com amzn click com 396730017X以及第 6 1 节中constexprlambda作者举了两个例子 auto squared1 aut
  • 检查 Swift 中是否存在 func

    我想在调用函数之前检查它是否存在 例如 if let touch AnyObject touches anyObject let location touch locationInView self touchMoved Int locat
  • Glassfish 作为 OSGi 容器

    我正在评估 OSGi 容器 主题是使用 Glassfish 来包含我的 OSGi 应用程序组件 我的问题是 Glassfish 对此有好处吗 有人有以这种方式使用它的经验吗 背景 该应用程序不是 Java EE 应用程序 而是 Spring
  • Bash 在脚本中退出 sudo

    我需要使用 sudo 执行安装脚本 但在脚本结束时 脚本需要退出 sudo 并以普通用户身份继续 Example sudo install sh 脚本以 root 身份运行并执行所需操作 su myscriptuser service my
  • 如何以编程方式获取我的设备的手机号码?

    我尝试过使用两种方法来检索我的电话号码 但这两种方法都不起作用 我用了 电话管理器 订阅管理器 我确实获得了网络名称 国家 地区 iso 和 IMEI 但每当我尝试返回号码时 它都不会返回任何内容 我还添加了这些所需的所有权限 我的清单如下
  • Selenium - 过时的元素引用:元素未附加到 C# 中的页面文档

    我正在使用 selenium 来获取网站表格中的数据进行分析 我必须扫描并获取大约 1000 行的表 我知道该页面有 Javascript 它会自动更新 DOM 但表的行太多 所以当我扫描代码时总是抛出异常 我尝试使用以下代码 Boolea
  • 在 Android 搜索视图中显示建议列表中的选择

    我有一个带有建议列表的搜索视图 如果用户从列表中选择一个项目 则会发送一个新意图 我可以应用我的过滤器 但搜索视图仍为空 如果我使用 setQuery 更新 onNewIntent 中的搜索视图 见下文 效果是所选项目显示在搜索视图中 但建
  • APNs 通过 macOS Sierra 推送通知

    我正在尝试使用连接到的简单 PHP 工具向我的手机发送推送通知ssl gateway push apple com 2195 但连接失败并出现以下错误 Warning stream socket client SSL operation f
  • 通过文件目标完美缓存

    阅读有关的文档后基于文件目标的输出缓存 https docs prefect io core concepts persistence html output caching based on a file target 我认为这个工作流程
  • iPhone SDK 合成 BOOL 数组

    当尝试合成如下所示的 bool 数组时 出现编译器错误 h import
  • getdata() 脚本仅在时间触发时超时

    我正在从另一个电子表格导入一个范围 并使用以下脚本将其粘贴到当前电子表格中 function getdata var values SpreadsheetApp openById XXXXXX getSheetByName SheetB g
  • 使用tinymce 进行绑定淘汰赛

    我正在尝试使用knockout 3 0 0 with tinymce 4 0 18 我想创造一些东西像这样 http jsfiddle net SalvadorDali jY3X2 1 很少有可编辑元素 此处为 3 个 但这些元素取自淘汰赛
  • 使用 ElementTree 读取 .xml 等电子表格

    我正在使用 ElementTree 读取 xml 文件 但有一个单元格无法读取其数据 我调整了我的文件以制作一个可重现的示例 如下所示 from xml etree import ElementTree import io xmlf