2014-01-15 15 views
5

getElementsByTagNameは、単一ノードレベルでしか再帰的に使用する方法はありますか?Python xml.domの再帰的(単一ノードレベル)getElementsByTagName

など。

xmldoc = minidom.parse('pom.xml') 
groupId = xmldoc.getElementsByTagName("groupId")[0].childNodes[0].nodeValue 

しかし残念ながら、最初の物理的な出現を見つけた:私はトップレベル(特にproject->groupId、ないproject->parent->groupId)、私が使用でgroupIdを取得したい場合は

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <parent> 
     <groupId>com.parent</groupId> 
     <artifactId>parent</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <relativePath>../pom.xml</relativePath> 
    </parent> 

    <modelVersion>2.0.0</modelVersion> 
    <groupId>com.parent.somemodule</groupId> 
    <artifactId>some_module</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>Some Module</name> 
    ... 

pom.xmlファイルを解析考えます階層レベル(project->parent->groupId)に関係なく、ファイル内のgroupIdの値です。私は実際に、その子どもの中ではなく、特定のノードレベルでのみ非再帰的な検索をしたいと思っています。 xml.domでそれを行う方法はありますか?

UPDATE:私はBeautifulSoupに切り替えたが、まだ、暗黙の再帰的なトラバースと同じ問題がある:あなたがgetElementsByTagName()以上の結果を反復処理し、ルートレベルにである最初の要素取ることができますFinding a nonrecursive DOM subnode in Python using BeautifulSoup

答えて

2

を:

group_id_element = next(element for element in xmldoc.getElementsByTagName("groupId") 
         if element.parentNode == xmldoc.documentElement) 

print group_id_element.childNodes[0].nodeValue 

標準ライブラリの一部でもあるElementTreeを使用すると、同じことを行うのがより簡単で短く高速になることに注意してください。

希望に役立ちます。

+0

「ElementTree」はもっと細かく洗練されていると言っていますか? – amphibient

+1

@ amphibientよく、これは私の意見です。 XMLファイルを解析する必要があるときは、 'ElementTree'、' lxml'、または 'BeautifulSoup'を使います。 – alecxe

+0

もご覧ください。http://stackoverflow.com/questions/21146417/simple-dom-traversing-in-python-using-xml-etree-elementtree?おかげで – amphibient