节点.toprettyxml()在Python中向DOCTYPE添加新行

2024-10-01 07:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

当使用prettify时,我的DOCTYPE被分成三行。我怎样才能保持在一条线上?在

“中断”输出:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE smil
  PUBLIC '-//W3C//DTD SMIL 2.0//EN'
  'http://www.w3.org/2001/SMIL20/SMIL20.dtd'>
<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>

剧本:

^{pr2}$

Tags: srchttpvideosystemdoctypecamp4sc
3条回答

在查看了当前的脚本和您在这个主题上提出的其他问题之后,我认为使用字符串操作构建smil文件可以使您的生活更简单。在

文件中几乎所有的xml都是静态的。要正确处理的唯一数据是video标记的属性值。为此,在标准库中有一个方便的函数,它完全可以满足您的需要:xml.sax.saxutils.quoteattr。在

因此,考虑到这些要点,这里有一个脚本应该更容易使用:

import sys, os, csv
from xml.sax.saxutils import quoteattr

smil_header = '''\
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta base="rtmp://cp23636.edgefcs.net/ondemand"/>
  </head>
  <body>
    <switch>
'''
smil_video = '''\
      <video src=%s system-bitrate=%s/>
'''
smil_footer = '''\
    </switch>
  </body>
</smil>
'''

src_format = 'mp4:soundcheck/%(year)s/%(id)s/%(file_root_name)s_%(suffix)s.mp4'

video_data = (
    ('256', '336000'), ('512', '592000'),
    ('768', '848000'), ('1128', '1208000'),
    )

root = os.getcwd()
if len(sys.argv) > 2:
    root = sys.argv[2]

with open(sys.argv[1], 'rU') as stream:

    for row in csv.DictReader(stream):
        smil = [smil_header]
        for suffix, bitrate in video_data:
            row['suffix'] = suffix
            smil.append(smil_video % (
                quoteattr(src_format) % row, quoteattr(bitrate)
                ))
        smil.append(smil_footer)

        directory = os.path.join(root, '%(year)s-%(id)s' % row)
        try:
            os.makedirs(directory)
        except OSError:
            pass
        path = os.path.join(directory, '%(file_root_name)s.smil' % row)
        print ':: writing file:', path
        with open(path, 'wb') as stream:
            stream.write(''.join(smil))

我认为你至少有三种选择:

  1. 接受新台词就行了。他们可能不受欢迎和丑陋,但他们是完全合法的。

  2. 添加一个用更好的DOCTYPE替换坏DOCTYPE的kludge。也许是这样的:

    import re
    
    pretty_xml = prettify(doctype, elem)
    m = re.search("(<!.*dtd'>)", pretty_xml, re.DOTALL)
    ugly_doctype = m.group() 
    fixed_xml = pretty_xml.replace(ugly_doctype, doctype)
    
  3. 使用功能更丰富的XML包。lxml浮现在脑海中;它主要与ElementTree兼容。通过使用lxml的^{}函数,您将不需要prettify函数,并且DOCTYPE将按您的需要显示出来。示例:

    ^{pr2}$

    输出:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">
    <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>
    

我认为不可能删除Node.toprettyxmlDOCTYPE生成的新行,至少以python的方式。在

它是DocumentType类的writexml方法,它从^{} module的第1284行开始,插入有问题的新行。插入的换行字符串最初来自Node.toprettyxml方法,并通过Document类的writexml方法传递。同样的换行字符串也被传递到Node的其他各种子类的writexml方法。在对Node.prettyxml的调用中更改换行字符串将更改整个输出的XML中使用的换行字符串。在

有各种各样的破解方法:修改minidom模块的本地副本,DocumentType类的writexml方法,或者对XML字符串进行后处理以删除不需要的新行。然而,这些方法都不吸引我。在

对我来说,最好的办法似乎是让事情保持原样。将DOCTYPE拆分成多行真的是一个严重的问题吗?在

相关问题 更多 >