使用Python和XML拆分`for`循环中的子元素
我的代码快完成了,但是我在分解for循环中的子元素时遇到了麻烦(?)如何在xml根节点中使每个元素都有自己的元素使用Python和XML拆分`for`循环中的子元素,python,xml,Python,Xml,我的代码快完成了,但是我在分解for循环中的子元素时遇到了麻烦(?)如何在xml根节点中使每个元素都有自己的元素 导入csv 导入系统 从xml.etree导入元素树 从xml.etree.ElementTree导入元素、子元素、注释到字符串 从xml.dom导入minidom def美化(要素): “”“为元素返回打印精美的XML字符串。 """ rough_string=ElementTree.tostring(元素'utf-8') 重解析=minidom.parseString(粗字符串)
导入csv
导入系统
从xml.etree导入元素树
从xml.etree.ElementTree导入元素、子元素、注释到字符串
从xml.dom导入minidom
def美化(要素):
“”“为元素返回打印精美的XML字符串。
"""
rough_string=ElementTree.tostring(元素'utf-8')
重解析=minidom.parseString(粗字符串)
返回重新解析的。toprettyxml(indent=”“)
xml=“”
doctype=“”
根=元素('smil')
root.set('xmlns','http://www.w3.org/2001/SMIL20/Language')
head=子元素(根,“head”)
元=子元素(头,'元基='rtmp://cp23636.edgefcs.net/ondemand"')
body=子元素(根“body”)
视频数据=((256,336000),
(512, 592000),
(768, 848000),
(1128, 1208000))
将open(sys.argv[1],'rU')作为f:
reader=csv.DictReader(f)
对于读取器中的行:
switch_tag=ElementTree.SubElement(主体“switch”)
对于后缀,视频数据中的比特率:
attrs={'src':(“mp4:soundcheck/{year}/{id}/{file_root_name}{suffix}.mp4”
.format(后缀=str(后缀),**行)),
“系统比特率”:str(比特率),
}
ElementTree.SubElement(开关标签'video',attrs)
打印xml+doctype+prettify(根目录)
返回:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd"><?xml version="1.0" ?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
<head>
<meta base="rtmp://cp23636.edgefcs.net/ondemand"/>
</head>
<body>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_1128.mp4" system-bitrate="1208000"/>
</switch>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/03_sc_ca_everything_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/03_sc_ca_everything_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/03_sc_ca_everything_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/03_sc_ca_everything_1128.mp4" system-bitrate="1208000"/>
</switch>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/04_sc_ca_thousandda_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/04_sc_ca_thousandda_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/04_sc_ca_thousandda_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/04_sc_ca_thousandda_1128.mp4" system-bitrate="1208000"/>
</switch>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/05_sc_ca_hereyoucom_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/05_sc_ca_hereyoucom_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/05_sc_ca_hereyoucom_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/05_sc_ca_hereyoucom_1128.mp4" system-bitrate="1208000"/>
</switch>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/06_sc_ca_intv_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/06_sc_ca_intv_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/06_sc_ca_intv_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/06_sc_ca_intv_1128.mp4" system-bitrate="1208000"/>
</switch>
</body>
</smil>
但我希望每个元素都是独立的。像这样:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd"><?xml version="1.0" ?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
<head>
<meta base="rtmp://cp23636.edgefcs.net/ondemand"/>
</head>
<body>
<switch>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_256.mp4" system-bitrate="336000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_512.mp4" system-bitrate="592000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_768.mp4" system-bitrate="848000"/>
<video src="mp4:soundcheck/1/clay_aiken/02_sc_ca_sorry_1128.mp4" system-bitrate="1208000"/>
</switch>
</body>
</smil>
及
像这样吗
import csv
import sys
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
from xml.dom import minidom
def prettify(doctype, elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = doctype + ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ", encoding = 'utf-8')
doctype = '<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">'
video_data = ((256, 336000),
(512, 592000),
(768, 848000),
(1128, 1208000))
with open(sys.argv[1], 'rU') as f:
reader = csv.DictReader(f)
for row in reader:
root = Element('smil')
root.set('xmlns', 'http://www.w3.org/2001/SMIL20/Language')
head = SubElement(root, 'head')
meta = SubElement(head, 'meta base="rtmp://cp23636.edgefcs.net/ondemand"')
body = SubElement(root, 'body')
switch_tag = ElementTree.SubElement(body, 'switch')
for suffix, bitrate in video_data:
attrs = {'src': ("mp4:soundcheck/{year}/{id}/{file_root_name}_{suffix}.mp4"
.format(suffix=str(suffix), **row)),
'system-bitrate': str(bitrate),
}
ElementTree.SubElement(switch_tag, 'video', attrs)
print prettify(doctype, root)
导入csv
导入系统
从xml.etree导入元素树
从xml.etree.ElementTree导入元素、子元素、注释到字符串
从xml.dom导入minidom
def美化(doctype,elem):
“”“为元素返回打印精美的XML字符串。
"""
rough_string=doctype+ElementTree.tostring(元素'utf-8')
重解析=minidom.parseString(粗字符串)
返回重新解析的.toprettyxml(indent=,encoding='utf-8')
doctype=“”
视频数据=((256,336000),
(512, 592000),
(768, 848000),
(1128, 1208000))
将open(sys.argv[1],'rU')作为f:
reader=csv.DictReader(f)
对于读取器中的行:
根=元素('smil')
root.set('xmlns','http://www.w3.org/2001/SMIL20/Language')
head=子元素(根,“head”)
元=子元素(头,'元基='rtmp://cp23636.edgefcs.net/ondemand"')
body=子元素(根“body”)
switch_tag=ElementTree.SubElement(主体“switch”)
对于后缀,视频数据中的比特率:
attrs={'src':(“mp4:soundcheck/{year}/{id}/{file_root_name}{suffix}.mp4”
.format(后缀=str(后缀),**行)),
“系统比特率”:str(比特率),
}
ElementTree.SubElement(开关标签'video',attrs)
打印美化(doctype,root)
谢谢!!就这样。它返回
如何在第二行获取DOCTYPE并删除重复的xml版本字符串?我已编辑以删除“打印xml”,并使用toprettyxml来完成此操作。现在,有一些方法可以切掉字符串并将DOCTYPE
放入其中,但是让我看看是否可以使用ElementTree
来完成此操作。。。相反…好吧,这有点麻烦,但做你想做的。插入DOCTYPE
正确的方法需要子类化ElementTree.TreeBuilder
来添加DOCTYPE
方法,这有点超出了这个问题的范围:)在这里,我不能忍受这样的混乱:)谢谢@RicardoCadenes,但现在它把DOCTYPE放在了3行上,就像这样;
import csv
import sys
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
from xml.dom import minidom
def prettify(doctype, elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = doctype + ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ", encoding = 'utf-8')
doctype = '<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">'
video_data = ((256, 336000),
(512, 592000),
(768, 848000),
(1128, 1208000))
with open(sys.argv[1], 'rU') as f:
reader = csv.DictReader(f)
for row in reader:
root = Element('smil')
root.set('xmlns', 'http://www.w3.org/2001/SMIL20/Language')
head = SubElement(root, 'head')
meta = SubElement(head, 'meta base="rtmp://cp23636.edgefcs.net/ondemand"')
body = SubElement(root, 'body')
switch_tag = ElementTree.SubElement(body, 'switch')
for suffix, bitrate in video_data:
attrs = {'src': ("mp4:soundcheck/{year}/{id}/{file_root_name}_{suffix}.mp4"
.format(suffix=str(suffix), **row)),
'system-bitrate': str(bitrate),
}
ElementTree.SubElement(switch_tag, 'video', attrs)
print prettify(doctype, root)