使用python将格式怪异的XML文件转换为CSV

使用python将格式怪异的XML文件转换为CSV,python,python-3.x,xml,csv,xmltocsv,Python,Python 3.x,Xml,Csv,Xmltocsv,我有一个奇怪的XML文档,其中包含电话号码的详细信息,我需要将其导出到CSV文档中,但问题是它的格式不正确。所有元素都在标记内部,一些名称字段重复,但与下面的示例不同,大多数重复的行包含额外的空格或逗号。所有数字都从名称字段缩进 <string>example1</string> <string>014584111</string> <string>example2</st

我有一个奇怪的XML文档,其中包含电话号码的详细信息,我需要将其导出到CSV文档中,但问题是它的格式不正确。所有元素都在标记内部,一些名称字段重复,但与下面的示例不同,大多数重复的行包含额外的空格或逗号。所有数字都从名称字段缩进

        <string>example1</string>
            <string>014584111</string>

        <string>example2</string>
            <string>04561212123</string>

        <string>example3</string>
            <string>+1 156151561</string>

        <string>example4</string>
            <string>564513212</string>
        
        <string>example3, </string>
        <string>example4  </string>

当然,这是可以做到的。如果你能用人类语言描述这个过程,你也可以编写程序

例如:

逐行读取文件?或者该文件是否适合存储? 剥去 这条线是预定的吗?->不->这是一把钥匙 这条线是预定的吗?->是->它是最后一个键的值 将结果添加到dict中 将dict写入.csv文件 所以-你现在需要做一些决定,比如:

导入文件很大吗?然后它可能无法放入内存,我们需要逐行处理。或者它是否适合记忆

这个项目需要很多次吗?还是只是一次性转换

然后,您可以将问题划分为更小的子问题,并为每个子问题编写一些测试


你还需要考虑更多的情况,比如文件大小,如果它是一次性脚本,如果有错误检查,如果有两个预期的行?等等。

下面是如何处理数据的


如果本例3在本例3+1 1561151之前,那么输出是什么?如果没有特定的模式,如何识别重复项?@bitranox查看XML输入的最后一条记录,看看结果是否正确。请随意投票选出这个答案:-看看数据-它是格式错误的XML,并且值是缩进的。问题中说明:所有数字都从名称字段缩进。通过使用普通的XML解析器,这些信息会丢失,因此需要手动解析。最后两行不应该出现在结果中,因为它们没有分配数字,这在问题的结果集中有说明。因此,很不幸,您的答案是错误的…@bitranox我的代码只是将XML加载到dict列表中。从这一点上,OP可以添加解决此问题的逻辑。我对XML输入所做的只是添加和。我没有改变任何事情!同样-您的转换忽略缩进-数字在该数据集中缩进。这些信息对于进一步的解析非常有用,而您忽略了它——这不是一个好主意!除此之外,您真的不需要XML解析器来剥离这些标记。
FullName  PhoneNumber
  
example1  014584111
example2  014584111    
example3  +1 156151561  
example4  564513212 
import xml.etree.ElementTree as ET

def is_phone_number(value):
    for x in value:
        if x != '+' and x != ' ' and not x.isnumeric():
            return False
    return True
    
xml = '''<r> <string>example1</string>
            <string>014584111</string>

        <string>example2</string>
            <string>04561212123</string>

        <string>example3</string>
            <string>+1 156151561</string>

        <string>example4</string>
            <string>564513212</string>
        
        <string>example3, </string>
        <string>example4  </string></r>'''
data = []
root = ET.fromstring(xml)
strings = root.findall('.//string')
i = 0
while i < len(strings):
    if is_phone_number(strings[i+1].text):
        data.append({'key': strings[i].text,'value':strings[i+1].text})
    i += 2

print(data)
[{'key': 'example1', 'value': '014584111'}, {'key': 'example2', 'value': '04561212123'}, {'key': 'example3', 'value': '+1 156151561'}, {'key': 'example4', 'value': '564513212'}]