【问题标题】:lxml - multiple root and issue with formattinglxml - 多个根和格式问题
【发布时间】:2018-08-06 20:43:52
【问题描述】:

我正在尝试从数据框生成 xml 文件。一切都很好,除了这个我无法弄清楚的小问题。为了便于理解,我删除了不必要的代码。

from lxml import etree as et

root = et.Element('MarketValueGrid')
root1 = et.SubElement(root,'CalculationOutputs')
print(et.tostring(root, pretty_print=True).decode('utf-8'))

这会产生

<MarketValueGrid>
 <CalculationOutputs/>
</MarketValueGrid>

我需要的是:

<MarketValueGrid>
 <CalculationOutputs>
 </CalculationOutputs>
</MarketValueGrid>

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    看看xml spec,你看到的是一个空元素。

    一旦您将一个子节点或一些内容(即使它是一个空白空间)放在节点中,您将获得与您正在寻找的格式相似的格式。

    from lxml import etree as et
    
    root = et.Element('MarketValueGrid')
    root1 = et.SubElement(root,'CalculationOutputs')
    root2 = et.SubElement(root1,'Value')
    
    
    print(et.tostring(root, pretty_print=True).decode('utf-8'))
    
    <MarketValueGrid>
      <CalculationOutputs>
        <Value/>
      </CalculationOutputs>
    </MarketValueGrid>
    

    在您的情况下,添加 root1 = et.SubElement(root,'CalculationOutputs').text="" 将生成您正在寻找的输出。

    <MarketValueGrid>
      <CalculationOutputs></CalculationOutputs>
    </MarketValueGrid>
    

    【讨论】:

    • 另外,&lt;CalculationOutputs/&gt;&lt;CalculationOutputs&gt;&lt;/CalculationOutputs&gt; 之间没有语义上的区别,它是由实现定义的,序列化器是否允许您选择表示或自行决定使用哪个表示。
    • @zhqiat 感谢您解释得这么好。原来我在第三级传递的是 root 而不是 root1,这造成了这种行为并使我感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2010-10-22
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多