gpt4 book ai didi

python - 使用 Python ElementTree 读取包含多个顶级项目的 XML?

转载 作者:数据小太阳 更新时间:2023-10-29 02:46:50 27 4
gpt4 key购买 nike

如果 XML 有多个顶级项,我如何使用 Python ElementTree 读取 XML 文件?

我有一个 XML 文件,我想使用 Python ElementTree 读取它。

不幸的是,它有多个顶级标签。我会包装 <doc>...</doc>在 XML 周围,除了我必须把 <doc> 之后 <?xml><!DOCTYPE>领域。但弄清楚在哪里 <!DOCTYPE> ends 是不平凡的。

我有什么:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FOO BAR "foo.dtd" [
<!ENTITY ...>
<!ENTITY ...>
<!ENTITY ...>
]>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>

我想要的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FOO BAR "foo.dtd" [
<!ENTITY ...>
<!ENTITY ...>
<!ENTITY ...>
]>
<DOC>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
</DOC>

注意标签 ARTICLE 的名称可能会更改,因此我无法对其进行 grep。

任何人都可以向我建议如何添加封闭的 <doc>...</doc>在 XML header 之后,还是建议另一种解决方法?

最佳答案

我编写了以下函数来在 XML 处理指令 之后添加一个顶层标记。您现在可以在我的 common Python library 中找到此代码作为common.myelementtree.add_toplevel_tag

import re
xmlprocre = re.compile("(\s*<[\?\!])")
def add_toplevel_tag(string):
"""
After all the XML processing instructions, add an enclosing top-level <DOC> tag, and return it.
e.g.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE FOO BAR "foo.dtd" [ <!ENTITY ...> <!ENTITY ...> <!ENTITY ...> ]> <ARTICLE> ...
</ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE>
=>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE FOO BAR "foo.dtd" [ <!ENTITY ...> <!ENTITY ...> <!ENTITY ...> ]><DOC> <ARTICLE> ...
</ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE></DOC>
"""
def _advance_proc(string, idx):
# If possible, advance over whitespace and one processing
# instruction starting at string index idx, and return its index.
# If not possible, return None
# Find the beginning of the processing instruction
m = xmlprocre.match(string[idx:])
if m is None: return None
#print "Group", m.group(1)
idx = idx + len(m.group(1))
#print "Remain", string[idx:]

# Find closing > bracket
bracketdebt = 1
while bracketdebt > 0:
if string[idx] == "<": bracketdebt += 1
elif string[idx] == ">": bracketdebt -= 1
idx += 1
#print "Remain", string[idx:]
return idx
loc = 0
while 1:
# Advance one processing instruction
newloc = _advance_proc(string, loc)
if newloc is None: break
else: loc = newloc
return string[:loc] + "<DOC>" + string[loc:] + "</DOC>"

关于python - 使用 Python ElementTree 读取包含多个顶级项目的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2113819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com