寻找一种方法来计算XML元素外观的数量达到某一点

时间:2014-03-03 00:57:24

标签: python xml database parsing sqlite

我是python和xml的新手,所以也许我没有使用正确的术语来找到我需要的东西,但是我在stackoverflow上看了一会儿,还尝试阅读dom和mini-dom的文档,以及找不到任何东西。

<AppName>
    <author>Person 1</author>
        <out>Output 1</out>
        <out>Output 2</out>
        <out>Output 3</out>
    <description> Description</description>
    <date>2012-11-06</date>
</AppName>
<AppName>
    <author>Person 2</author>
        <out>Output 1</out>
        <out>Output 2</out>
        <out>Output 3</out>
        <out>Output 4</out>
    <description> Description</description>
    <date>2012-11-06</date>        
</AppName>
    ...
  countinues for 500 AppNames

所以我试图将信息配对以写入

文件
Person1 || Output1
Person1 || Output2
Person1 || Output3
Person2 || Output1
Person2 || Output2
Person2 || Output3
    etc...

但是当我使用minidom从文件中读取时

dom = xml.dom.minidom.parse(filename)
authorList = dom.getElementsByTagName('author')
outList = dom.getElementsByTagName('out")

我不知道如何有效地配对它们,因为元素因作者而异,我不知道如何计算特定作者的数量。 我正在写它

text_file = open ("author.txt", "w")
for i in range(0, len(authorList)):
    text_file.write(authorList.__getitem__(i).firstChild.nodeValue)
    text_file.write(" || ")
    text_file.write(outList._getitem_(i).firstChild.nodeValue)

text_file.close()

这显然是不正确的但是我无法弄清楚如何配对它们而没有找到特定于作者的元素的出现次数,因此任何帮助都可以做到这一点,或者其他可能的解决方案来达到预期的效果欢迎。

我已经查看了Domminidom上的文档 我知道你可以

len(dom.getElementsByTagName('out'))

但这只会给我整个xmlfile的总数。

任何指针/提示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

这里的技巧是你想要将每个AppName解析为一个单元,因为作者及其out元素是兄弟姐妹。我会按照以下方式做点什么:

dom = xml.dom.minidom.parse(filename)
AppNames = dom.getElementsByTagName('AppName')

with open("author.txt", "w") as text_file:
    for AppName in AppNames:
        authorName = AppName.getElementsByTagName("author")[0].nodeValue
        works = AppName.getElementsByTagName("out")
        for work in works:
            workTitle = work.nodeValue
            test_file.write("{} || {}").format(authorName, work)

我没有对此进行测试,在处理XML时我倾向于使用elementTree,因此上面的语法可能不是100%正确。

P.S。 python中的一般约定是具有前导下划线的方法/函数是私有的,not meant to be accessed directly