Python问题使用xml.dom.minidom Document。使用toprettyxml()在子元素之间的额外空行

时间:2012-04-05 19:24:20

标签: xml python-3.x minidom

请耐心等待我,因为我对python(以及更大的编程社区)非常陌生,但我一直受到一位比我更有经验的同事的指导。我们正在尝试编写一个读取的python脚本在XML文件中挑选数据的某些部分,编辑一些变量值,然后重新组装XML。我们遇到的问题是数据格式化的方式,因为它使用toprettyxml()传递回新的数据

基本上,文件的上半部分有一堆我们根本不需要修改的元素,因此我们试图完全抓取这些元素,然后将它们重新附加到根目录上。我们重新组装。同一级别的同一页面上的一些较低元素被分割成内存中的较小项目并在最低子级别重新组装。手动重新组装和附加的工作正常。

所以这里应该是相关的代码:

def __handleElemsWithAtrributes(elem):
    #returns empty element with all attributes of source element
    tmpDoc = Document()
    result = tmpDoc.createElement(elem.item(0).tagName)
    attr_map = elem.item(0).attributes
    for i in range(attr_map.length):
        result.setAttribute(attr_map.item(i).name,attr_map.item(i).value)
    return result

def __getWholeElement(elems):
    #returns element with all attributes of source element and all contents
    if len(elems) == 0:
        return 0
    temp = Document()
    for e in elems:
        result = temp.createElement(e.tagName)
        attr_map = e.attributes
        for i in range(attr_map.length):
            result.setAttribute(attr_map.item(i).name,attr_map.item(i).value)
        result = e
    return result


def __init__():
      ##A bunch of other stuff I'm leaving out...
                f = xml.dom.minidom.parse(pathToFile)
                doc = Document()

                modules = f.getElementsByTagName("Module")
                descriptions = f.getElementsByTagName("Description")
                steptree = f.getElementsByTagName("StepTree")
                reference = f.getElementsByTagName("LessonReference")

                mod_val = __handleElemsWithAtrributes(modules)
                des_val = __getWholeElement(descriptions)
                step_val = __getWholeElement(steptree)
                ref_val = __getWholeElement(reference)

                if des_val != 0 and mod_val != 0 and step_val != 0 and ref_val != 0:
                    mod_val.appendChild(des_val)
                    mod_val.appendChild(step_val)
                    mod_val.appendChild(ref_val)
                    doc.appendChild(mod_val)
               o.write(doc.toprettyxml())

不,这里的标签没有准确保存,因为我从几个不同的区域复制了,但我确信你得到了要点。

基本上,我使用的输入看起来像这样:

<Module aatribute="" attribte2="" attribute3="" >
<Description>
    <Title>SomeTitle</Title>
    <Objective>An objective</Objective>
    <Action>
        <Familiarize>familiarize text</Familiarize>
    </Action>
    <Condition>
        <Familiarize>Condition text</Familiarize>
    </Condition>
    <Standard>
        <Familiarize>Standard text</Familiarize>
    </Standard>
    <PerformanceMeasures>
        <Measure>COL text</Measure>
    </PerformanceMeasures>
    <TMReferences>
        <Reference>Reference text</Reference> 
    </TMReferences>
</Description>

然后当它重新组装时,看起来像这样:

<Module aatribute="" attribte2="" attribute3="" >
<Description>


    <Title>SomeTitle</Title>


    <Objective>An objective</Objective>


    <Action>


        <Familiarize>familiarize text</Familiarize>


    </Action>


    <Condition>


        <Familiarize>Condition text</Familiarize>


    </Condition>


    <Standard>


        <Familiarize>Standard text</Familiarize>


    </Standard>


    <PerformanceMeasures>


        <Measure>COL text</Measure>


    </PerformanceMeasures>


    <TMReferences>


        <Reference>Reference text</Reference> 


    </TMReferences>


</Description>

如何让它停止制作所有额外的空行?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我有同样的问题。 问题是,每次Python跳过一行时,它都会在树中为它添加一个textNode。 因此,topprettyxml()是一个非常恶毒的函数,因为它会在您不知道它的情况下将节点添加到树中。

其中一个解决方案是在开始解析文件时找到一种方法来擦除所有无用的textNodes(我现在正在寻找它,仍然没有找到“漂亮”的解决方案)。 / p>

逐节点删除:

def cleanUpNodes(nodes):
    for node in nodes.childNodes:
        if node.nodeType == Node.TEXT_NODE:
            node.data = ''
    nodes.normalize()

来自http://mail.python.org/pipermail/xml-sig/2004-March/010191.html

答案 1 :(得分:-1)

谢谢你递归!!

def cleanUpNodes(self,nodes):
        for node in nodes.childNodes:
            if node.nodeType == node.TEXT_NODE and (node.data.startswith('\t') or node.data.startswith('\n') or node.data.startswith('\r') ):
                node.data = ''
            if node.nodeType == node.ELEMENT_NODE:
                self.cleanUpNodes(node)
        nodes.normalize()