- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从 xml 播放列表“导出”到 html 表以进行共享。但 iTunes 库文件使用键值对而不是更有意义的 XML 标签。有没有一种简单的方法也可以获取 <value>
在这些键/值对中?
这让我了解到 <key>
的值,即轨道 ID 名称、艺术家、专辑艺术家等,但我似乎找不到一种方法来获取下一个键的值,即 <integer>
49924,或<string>
EP。 35 | 35你做什么...我可以(应该)使用 ElementTree 来做到这一点,还是应该转向正则表达式或其他一些库?谢谢!
data = '''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Major Version</key><integer>1</integer>
<key>Minor Version</key><integer>1</integer>
<key>Date</key><date>2019-01-21T07:31:15Z</date>
<key>Application Version</key><string>12.8.0.150</string>
<key>Features</key><integer>5</integer>
<key>Show Content Ratings</key><true/>
<key>Music Folder</key><string>file:///Users/Music/iTunes/iTunes%20Media/</string>
<key>Library Persistent ID</key><string>75E62CF156F5AE1B</string>
<key>Tracks</key>
<dict>
<key>49924</key>
<dict>
<key>Track ID</key><integer>49924</integer>
<key>Name</key><string>Ep. 35 | What Do Your Morals Taste Like? | Guest: Jonathan Haidt</string>
<key>Artist</key><string>Blaze Podcast Network</string>
<key>Album Artist</key><string>Blaze Podcast Network</string>
<key>Album</key><string>Something's Off with Andrew Heaton</string>
<key>Genre</key><string>News & Politics</string>
<key>Kind</key><string>MPEG audio file</string>
<key>Size</key><integer>48123940</integer>
<key>Total Time</key><integer>3004133</integer>
<key>Year</key><integer>2019</integer>
<key>Date Modified</key><date>2019-01-13T01:10:30Z</date>
<key>Date Added</key><date>2019-01-13T01:10:30Z</date>
<key>Bit Rate</key><integer>128</integer>
<key>Sample Rate</key><integer>44100</integer>
<key>Release Date</key><date>2019-01-11T12:00:00Z</date>
<key>Artwork Count</key><integer>1</integer>
<key>Persistent ID</key><string>5FAE7186A09E5D3E</string>
<key>Disabled</key><true/>
<key>Track Type</key><string>File</string>
<key>Purchased</key><true/>
<key>Podcast</key><true/>
<key>Unplayed</key><true/>
<key>Location</key><string>file:///Users/Music/iTunes/iTunes%20Media/Podcasts/Something's%20Off%20with%20Andrew%20Heaton/Ep.%2035%20_%20What%20Do%20Your%20Morals%20Taste%20Like_%20_%20Guest_%20Jonathan%20Haidt.mp3</string>
<key>File Folder Count</key><integer>4</integer>
<key>Library Folder Count</key><integer>1</integer>
</dict>
</dict>
</dict>
</plist>'''
from xml.etree import ElementTree as ET
xml = ET.fromstring(data)
lst = xml.findall('dict/dict/dict/key')
for item in lst:
print(item.text)
最佳答案
Question: How to access value element in iTunes xml
以下解决方案使用 lxml.etree.iterparse
附加 <key>
带有以下标记 <value>
标签来构建Python dict {key:value}
.
使用的模块和内置函数:
<小时/>from lxml import etree
import io
class Playlist:
def __init__(self, fh):
"""
Initialize 'iterparse' to generate 'start' and 'end' events on all tags
:param fh: File Handle from the XML File to parse
"""
self.context = etree.iterparse(fh, events=("start", "end",))
def _parse(self):
"""
Yield only at 'end' event, except 'start' from tag 'dict'
:return: yield current Element
"""
for event, elem in self.context:
if elem.tag == 'plist' or \
(event == 'start' and not elem.tag == 'dict'):
continue
yield elem
def _parse_key_value(self, key=None):
_dict = {}
for elem in self._parse():
if elem.tag == 'key':
key = elem.text
continue
if elem.tag in ['integer', 'string', 'date']:
if not key is None:
_dict[key] = elem.text
key = None
else:
print('Missing key for value {}'.format(elem.text))
elif elem.tag in ['true', 'false']:
_dict[key] = elem.tag == 'true'
elif elem.tag == 'dict':
if not key is None:
_dict[key] = self._parse_dict(key)
key = None
else:
return elem, _dict
else:
print('Unknow tag {}'.format(elem.tag))
def _parse_dict(self, key=None):
elem = next(self._parse())
elem, _dict = self._parse_key_value(elem.text)
return _dict
def __iter__(self):
for elem in self._parse():
if elem.tag == 'dict':
yield self._parse_dict()
else:
print('Unknow tag {}'.format(elem.tag))
if __name__ == "__main__":
data = b'''<?xml...'''
with io.BytesIO(data) as in_xml:
for record in Playlist(in_xml):
print("record:{}".format(record))
for key, value in record.items():
print("{}:{}".format(key, value))
Output:
record:{'Major Version': '1', 'Minor Version': '1'... (omitted for brevity)
Major Version:1
Minor Version:1
Date:2019-01-24T10:31:15Z
Tracks:{'99244': {'Track ID': '99244', 'Artist': 'Blaze Podcast Network', ... (omitted for brevity)}}
使用 Python 测试:3.5
关于python - 如何使用 ElementTree 访问 iTunes xml 中的值元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54341950/
我正在尝试从字符串构建ElementTree。当我执行以下操作时(如 Python ElementTree: Parsing a string and getting ElementTree inst
我正在使用 elementtree.ElementTree.iterparse 来解析大型 (371 MB) xml 文件。 我的代码基本上是这样的: outf = open('out.txt', '
有没有办法在 elementtree.ElementTree 中忽略标记名称中的 XML 命名空间? 我尝试打印所有 technicalContact 标签: for item in root.get
我使用 xml.etree.elementtree.Element 创建了一个 XML 文档,并想使用 ElementTree.write() 函数打印它但是出来的声明标签是 虽然我需要用双引号引起
这个问题已经有答案了: What is the best way to remove accents (normalize) in a Python unicode string? (14 个回答)
我想为此处元素国家/地区新加坡旁边的元素创建子元素。 假设我的 test.xml 文件如下所示 2008 141100
我正在使用ElementTree加载一系列 XML 文件并解析它们。解析文件时,我将从其中获取一些数据(标题和文本段落)。然后我需要获取一些存储在 XML 中的文件名。它们包含在名为 ContentI
我必须将多个 XML 文件合并为一个。此外,新文件的结构也不同。这是我的“旧”结构: 1
我正在解析一个 xml 文件:http://pastebin.com/fw151jQN我希望在副本中读取它的大部分内容并将其写入一个新文件,其中一些已修改,很多未修改,还有很多被忽略。作为初始阶段,我
这是 XML: TARGET_NAME_1 5 a string goes here TARGET_NA
from lxml import etree from xml.etree.ElementTree import Element, SubElement, dump listing = Element
当涉及到模块/库时,为了可读性,我喜欢在 python 中使用完整的命名空间。我想知道为什么这对 xml 库不起作用。我认为 import xml 还将导入 etree 和命名空间中的所有其他内容。至
这里是 Python 菜鸟。想知道删除所有 updated 属性值为 true 的“profile”标签的最干净、最好的方法是什么。 我已经尝试了下面的代码,但它抛出了:SyntaxError("ca
尝试从 xml 文档中删除元素时出现以下错误。“ValueError: list.remove(x): x 不在列表中”这是代码,错误发生在删除的行上。 import xml.etree.Elemen
所以我必须编写一个“重复检查器”来比较两个 XML,看看它们是否相同(包含相同的数据)。现在因为它们来自同一个类并且是从 XSD 结构中生成的,所以内部元素的顺序很可能是相同的。 我能想到的进行重复检
我有一个 XML 文档,我正在使用 ElementTree 阅读和附加该文档。这有多个命名空间声明。据我所知,ElementTree 只允许声明一个全局命名空间: ET.register_namesp
从这里开始: stuff
我是 ElementTree 的新手。我正在尝试获取 来自 XML 响应的值。 以下代码对我不起作用。如何提取 中的值?我不确定号码在哪里 53是从这里来的。 ... r = req
以下代码: import xml.etree.ElementTree as ET xml = '''\ ''' root = ET.fromstring(xml)
我无法控制我获得的 XML 的质量。在某些情况下是: ... 在其他方面我得到: ... 我想我也应该处理 ... 整个架构都是相同的,我只需要一个解析器来处理它。我该如何处理所有这些
我是一名优秀的程序员,十分优秀!