1

xmlファイルを作成するアプリケーションを作成しようとしていますが、特定の要素にテキストを割り当てたいと思います。このテキストは、フォルダ上の画像ファイルで構成されています。コードは次のとおりです。

    import glob
    import os
    import os.path

    from xml.etree import ElementTree
    from xml.dom import minidom
    import xml.etree.ElementTree as ET

    def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
        rough_string = ElementTree.tostring(elem, 'utf-8')
        reparsed = minidom.parseString(rough_string)
        return reparsed.toprettyxml(indent="  ")

    path = "/home/unkuiri/Ubuntu One/Wallpapers/*"


    background = ET.Element('background')
    starttime = ET.SubElement(background, 'starttime')
    year = ET.SubElement(starttime, 'year')
    month = ET.SubElement(starttime, 'month')
    day = ET.SubElement(starttime, 'day')
    hour = ET.SubElement(starttime, 'hour')
    minute = ET.SubElement(starttime, 'minute')
    second = ET.SubElement(starttime, 'second')
    static = ET.SubElement(background, 'static')
    duration_stat = ET.SubElement(static, 'duration')
    files = ET.SubElement(static, 'file')
    transition = ET.SubElement(background, 'transition')
    duration_trans = ET.SubElement(transition, 'duration')
    from1 = ET.SubElement(transition, 'from')
    to = ET.SubElement(transition, 'to')

    dirList = glob.glob(path)

    while len(background.findall("./static/file")) <= len([name for name in os.listdir('.') if os.path.isfile(name)]):
            background.append(static)
            background.append(transition)
            continue

    for fname in dirList:   

        to.text = fname
        files.text = fname
        from1.text = fname


    print prettify(background)

このコードは、正しくフォーマットされたxmlを出力しますが、最後のパスのみを使用して、フォルダー内のファイルの数と同じ回数だけ繰り返します。私が欲しいのは、「file」要素ごとに1つのパスを出力し、その同じパスを前の「to」要素と次の「element」要素に出力することです。多分それは私が知らない単純な解決策です。私はまだ初心者です。

前もって感謝します

4

3 に答える 3

3

単一の要素を作成し、この同じ要素を複数回追加しているだけです。

forループでは、その要素のメンバーを何度も割り当てているため、最終的には最後の要素になりますfname

新しい要素を作成し、forループで毎回入力する必要があります

おそらくあなたはもっとこのようなものを持っているべきです

background = ET.Element('background')
dirList = glob.glob(path)

for fname in dirList:   

    starttime = ET.SubElement(background, 'starttime')
    year = ET.SubElement(starttime, 'year')
    month = ET.SubElement(starttime, 'month')
    day = ET.SubElement(starttime, 'day')
    hour = ET.SubElement(starttime, 'hour')
    minute = ET.SubElement(starttime, 'minute')
    second = ET.SubElement(starttime, 'second')
    static = ET.SubElement(background, 'static')
    duration_stat = ET.SubElement(static, 'duration')
    files = ET.SubElement(static, 'file')
    transition = ET.SubElement(background, 'transition')
    duration_trans = ET.SubElement(transition, 'duration')
    from1 = ET.SubElement(transition, 'from')
    to = ET.SubElement(transition, 'to')

    to.text = fname
    files.text = fname
    from1.text = fname
于 2012-10-31T00:33:25.460 に答える
0

私はこのコードでこの質問を解決することができました:

    import glob
    from xml.etree import ElementTree
    from xml.dom import minidom

    def prettify(elem):
        """Return a pretty-printed XML string for the Element.
        """
        rough_string = ElementTree.tostring(elem, 'utf-8')
        reparsed = minidom.parseString(rough_string)
        return reparsed.toprettyxml(indent="  ")

    import xml.etree.ElementTree as ET

    path = "/home/unkuiri/Ubuntu One/Wallpapers/*"


    background = ET.Element('background')
    dirList = glob.glob(path)
    starttime = ET.SubElement(background, 'starttime')
    year = ET.SubElement(starttime, 'year')
    year.text = '2012'
    month = ET.SubElement(starttime, 'month')
    month.text = '10'
    day = ET.SubElement(starttime, 'day')
    day.text = '10'
    hour = ET.SubElement(starttime, 'hour')
    hour.text = '00'
    minute = ET.SubElement(starttime, 'minute')
    minute.text = '00'
    second = ET.SubElement(starttime, 'second')
    second.text = '00'


    for i,fname in enumerate(dirList):    

        static = ET.SubElement(background, 'static')
        duration_stat = ET.SubElement(static, 'duration')
        duration_stat.text = '1795.0'
        files = ET.SubElement(static, 'file')
        transition = ET.SubElement(background, 'transition')
        duration_trans = ET.SubElement(transition, 'duration')
        duration_trans.text = '5.0'
        from1 = ET.SubElement(transition, 'from')
        to = ET.SubElement(transition, 'to')

        from1.text = dirList[i-1]

        files.text = dirList[i-1]

        to.text = dirList[i]


    print prettify(background)
于 2012-11-06T15:06:51.913 に答える
0

どこにも保存せずに、反復ごとにto / files/from1を踏みます。データを処理する前に、各反復で前の反復の内容が上書きされます。

これらの変数を保存するつもりでしたか?print prettify(background)各反復で行うつもりでしたか?

于 2012-10-31T00:30:23.290 に答える