【问题标题】:Append new elements to XML将新元素附加到 XML
【发布时间】:2021-04-30 13:00:14
【问题描述】:

我有基础 XML,我想向其中添加新元素。但它失败了,我不明白为什么。

我的基础 XML:

<?xml version="1.0" encoding="utf-8"?>
<vehicleDefinitions>
    <vehicleType id="bus">
        <capacity>
            <seats persons="3"/>
            <standingRoom persons="9"/>
        </capacity>
        <length meter="12.3"/>
        <width meter="2.5"/>
        <accessTime secondsPerPerson="0.5"/>
        <egressTime secondsPerPerson="0.5"/>
        <doorOperation mode="serial"/>
        <passengerCarEquivalents pce="0.28"/>
    </vehicleType>
</vehicleDefinitions>

我的代码:

from lxml import etree

schedule = etree.parse('schedule_mapped.xml') #I use this file to get data from it
vehicles = etree.parse('vehicles.xml') #I'm reading my base XML
vehicles_root = vehicles.getroot() #Getting its root
for transitLine in schedule.findall('transitLine'):
    tstype = transitLine.find('transitRoute').find('transportMode').text
    for transitRoute in transitLine.findall('transitRoute'):
        for departure in transitRoute.find('departures').findall('departure'):
            tsname = departure.get('vehicleRefId')
            vehicle = etree.SubElement(vehicles_root, 'vehicle') #I want to add a child to my root element
            vehicle.attrib['id'] = tsname
            vehicle.attrib['type'] = tstype

我的输出 XML 的结构是正确的。我的意思是添加了孩子:

但是在将 XML 写入文件之后

with open(ts.replace('schedule', 'vehicles'), 'wb') as f:
        f.write(etree.tostring(vehicles,pretty_print=True,encoding='utf8'))

我收到了

我发现问题可能出在基础 XML 中的 unreadable characters 中,但我不知道如何解决。

【问题讨论】:

  • 您是否尝试过etree.write(output_filename) 并确保为您想要的每个标签插入\n 字符。

标签: python xml lxml


【解决方案1】:

还要考虑XSLT,这是一种专门用于转换XML 文件的语言,它可以使用document() 函数从不同的XML 文件中检索节点。此外,您可以更好地控制输出,包括缩进和换行、标题等。Python 的lxml 可以运行 XSLT 1.0 脚本。这样做可以避免任何应用层嵌套循环。

XSLT (另存为.xsl文件,下面Python中使用)

注意对其他 .xml 文件的引用。假定这两个 XML 文件位于同一目录中。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="vehicleDefinitions">
    <xsl:copy>
        <xsl:copy-of select="vehicleType"/>
        <xsl:for-each select="document('schedule_mapped.xml')/descendant::departure">
          <vehicle id="{@vehicleRefId}" 
                   type="{../preceding-sibling::transportMode}"/>
        </xsl:for-each>
    </xsl:copy>
  </xsl:template>
    
</xsl:stylesheet>

Python

from lxml import etree

doc = etree.parse('vehicle.xml')
xsl = etree.parse('script.xsl')

transformer = etree.XSLT(xsl)
result = transformer(doc)

with open('Output.xml', 'wb') as f:
    f.write(result)

【讨论】:

    【解决方案2】:

    所以,我终于找到了解决方案。我们可以只解析没有空白字符的 XML。它允许“漂亮的打印”正常工作。

    def getClean(filename):
            parser = etree.XMLParser(remove_blank_text=True)
            cleanTree = etree.parse(filename, parser)
            return cleanTree
    

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 2011-10-05
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多