如何将多个XML元素解析为一个字符串?

2024-09-28 23:12:52 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑下面的XML,它只包含两个名为Mydoc的节点:

<?xml version="1.0" encoding="UTF-8" ?>
<Mydoc Time="2017-01-02"
    Period="2017-01-03">
    <mycontent ClassID="kinder">
        <bibliography>
            <Id>
                <Num>123456</Num>
            </Id>
                <Body>
this is some crazy text my friend
                </Body>
                <myreaders>
                    <names>
                        <Id>john</Id>
                        <value>95</value>
                    </names>
                </myreaders>
                <school>
                    <myclass>
                        <Id>12</Id>
                        <name>Laura</name>
                    </myclass>
                    <myclass>
                        <Id>14</Id>
                        <name>Frank</name>
                    </myclass>
                    <myclass>
                        <Id>144</Id>
                        <name>Jonny</name>
                    </myclass>
                    <myclass>
                        <Id>222</Id>
                        <name>Alex</name>
                    </myclass>
                    <myclass>
                        <Id>5443</Id>
                        <name>Johnny Doe</name>
                    </myclass>
                </school>
        </bibliography>
</mycontent>
    <mycontent ClassID="preK">
        <bibliography>
            <Id>
                <Num>123456</Num>
            </Id>
                <Body>
this is another crazy text my friend
                </Body>
                <myreaders>
                    <names>
                        <Id>fritz</Id>
                        <value>133</value>
                    </names>
                </myreaders>
        </bibliography>
</mycontent>
</Mydoc>

我试图使用xml.etree来解析它,并将每个节点mydoc放入Pandas数据帧中的一行。你知道吗

但是,如您所见,有多个名为myclass的元素,我希望将它们合并到数据帧的一个单元格中。你知道吗

例如,预期的输出(一个Pandas数据帧,有两行两列)如下所示:

myreaders      school
"(john-95)"  "(12-Laura),(14-Frank),(144-Johnny),(222-Alex),(5443-Johnny Doe)"
"(fritz-133)" ""

我试着玩xpath,但是我无法将我的xpath查找组合成一个像"(12-Laura),(14-Frank),(144-Johnny),(222-Alex),(5443-Johnny Doe)"这样的字符串化列表

有什么建议吗?你知道吗

谢谢!你知道吗


Tags: franknameidnamesvaluemyclassbodynum
3条回答

与其他答案类似,略短一点,适用于新添加的节点:

parsedXML = ET.parse( "sample.xml")
root = parsedXML.getroot()
pairs0 = []
pairs1 = []
for mycontent in root.iter('mycontent'):
    pairs0.append(','.join(['(' + name[0].text + '-' + name[1].text + ')' for name in mycontent.iter('names')]))
    pairs1.append(','.join(['(' + myclass[0].text + '-' + myclass[1].text + ')' for myclass in mycontent.iter('myclass')]))
df = pd.DataFrame(data = {"myreaders": pairs0, "school": pairs1}, columns=['myreaders', 'school'])

编辑:修改以解决多个案例。你知道吗

您可以尝试XmlToDict,并将您的XML解析为字典/列表,这会使您的尝试变得更加容易。 然后,您可以循环/浏览myclass字典的列表。 希望能有所帮助。你知道吗

它成了一个很好的列表理解装置,但我认为这是你需要的。你知道吗

import xml.etree.ElementTree as ET
import pandas as pd
tree = ET.parse('test.xml')
root = tree.getroot()
dicty = {}
dicty['myreaders'] = [','.join(['(' + x.findall('Id')[0].text + '-' + x.findall('value')[0].text + ')' for x in (root.findall('.//mycontent/bibliography/myreaders/names'))])]
dicty['school'] = [','.join(['(' + x.findall('Id')[0].text + '-' + x.findall('name')[0].text + ')' for x in (root.findall('.//mycontent/bibliography/school/myclass'))])]
print(dicty)
print(pd.DataFrame(dicty))

输出:

   myreaders                                             school
0  (john-95)  (12-Laura),(14-Frank),(144-Jonny),(222-Alex),(...

没有真正简单的方法来解析xml,您需要对数据结构进行大量的分析。你知道吗

相关问题 更多 >