<p>您的主要问题是,您实际上只是将数据从XML以几乎与您发现的相同的状态从XML发送到CSV。您所指的“空”元素不是空的,它们不存在于XML中。在</p>
<p>我可以想出两种方法来让这项工作做得更好。第一种方法是更改XML,使每个<code><Customer></code>元素以相同的顺序包含所有元素,即使这些元素是完全空的。换句话说,您的XML可能如下所示:</p>
<pre><code><Customer>
<Id_Customer>xyz1</Id_Customer>
<Segment>abc1</Segment>
<Event>
<Nature>info1</Nature>
<Extrainfo>info2</Extrainfo>
</Event>
<Adress>
<zipcode></zipcode>
<street></street>
<number></number>
</Adress>
</Customer>
<Customer>
<Id_Customer>zzwy</Id_Customer>
<Segment>c2</Segment>
<Event>
<Nature></Nature>
<Extrainfo></Extrainfo>
</Event>
<Adress>
<zipcode>77098</zipcode>
<street>belaire drive</street>
<number>5</number>
</Adress>
</Customer>
</code></pre>
<p>如果您愿意,您可以在Python代码中添加一个条件,将空字符串(<code>""</code>)替换为单词“empty”,因为您指出了您希望它这样说。在</p>
<p>另一种方法可以生成更复杂的Python代码,但实际上可能是更好的方法。那就是使用类或dict对数据进行排序:每个<code><Customer></code>标记一个dict或object。对于你所做的,我想说创建一个类可能有点过头了,所以一个dict就足够了。(使用<a href="https://docs.python.org/3/library/collections.html#collections.defaultdict" rel="nofollow noreferrer">defaultdict</a>而不是普通dict将允许您在找不到值时自动提供单词“empty”,因此我将对此进行研究。)</p>
<p>基本上,程序流程如下:</p>
<ol>
<li>创建一个空列表来存储您的dicts。<code>customers = []</code></li>
<li>循环遍历XML树中的<code><Customer></code>元素。对于每个客户:
<ol>
<li>创建一个新的dict并将其添加到列表中。<code>customer={}</code>或<code>customer=defaultdict("empty")</code>,然后<code>customers.append(customer)</code></li>
<li>循环遍历该元素的子元素,并为每个元素填充dict中的信息。类似<code>customer[elem.tag]=elem.text</code>的东西可能就是你要找的。在</li>
</ol></li>
<li>创建要从中获取的所有dict键的列表,其顺序与CSV中的头相同。例如<code>keys=["Id_Customer", "Segment", etc...]</code></li>
<li>循环查看在步骤1和2中创建的列表。e、 g.<code>for customer in customers:</code>对于每个迭代:
<ol>
<li>循环查看在步骤3中创建的列表。e、 g.<code>for key in keys:</code></li>
<li>对于每个键,从dict中获取相应的值,并将该值添加到CSV输出中。假设您有一个名为“csv”的open file对象,类似这样的方法是可行的:<code>csv.write(customer[key])</code>(当然,此时您也希望将逗号写入文件,除非它是<code>keys</code>循环的最后一次迭代,然后改为写一个新行。你可以用<code>key == keys[-1]</code>)来测试它</li>
</ol></li>
</ol>