我可以使用 lxml 来完成我想做的大部分事情,尽管阅读令人困惑的示例和教程很困难。简而言之,我能够读取外部 xml 文件并通过 lxml 将其导入正确的树状格式。
为了证明这一点,如果我输入:
print(etree.tostring(myXmlTree, pretty_print= True, method= "xml") )
我得到以下输出:
<net xmlns="http://www.arin.net/whoisrws/core/v1" xmlns:ns2="http://www.arin.net/whoisrws/rdns/v1" xmlns:ns3="http://www.arin.net/whoisrws/netref/v2" termsOfUse="https://www.arin.net/whois_tou.html">
<registrationDate>2006-08-29T00:00:00-04:00</registrationDate>
<ref>http://whois.arin.net/rest/net/NET-79-0-0-0-1</ref>
<endAddress>79.255.255.255</endAddress>
<handle>NET-79-0-0-0-1</handle>
<name>79-RIPE</name>
<netBlocks>
<netBlock>
<cidrLength>8</cidrLength>
<endAddress>79.255.255.255</endAddress>
<description>Allocated to RIPE NCC</description>
<type>RN</type>
<startAddress>79.0.0.0</startAddress>
</netBlock>
</netBlocks>
<orgRef name="RIPE Network Coordination Centre" handle="RIPE">http://whois.arin.net/rest/org/RIPE</orgRef>
<comment>
<line number="0">These addresses have been further assigned to users in</line>
<line number="1">the RIPE NCC region. Contact information can be found in</line>
<line number="2">the RIPE database at http://www.ripe.net/whois</line>
</comment>
<startAddress>79.0.0.0</startAddress>
<updateDate>2009-05-18T07:34:02-04:00</updateDate>
<version>4</version>
</net>
好的,这对人类消费很好,但对机器没有用。如果我想要特定的元素,比如 xml 中的开始和结束 IP 地址,我可以输入:
ns = myXmlTree.nsmap.values()[0]
myXmlTree.findall("{" + ns + "}startAddress")[0].text
myXmlTree.findall("{" + ns + "}endAddress")[0].text
我会收到:
'79.0.0.0'
'79.255.255.255'
但是我仍然需要以人类的身份查看 xml 文件才能知道那里有哪些元素。相反,我希望能够检索特定级别的所有元素的名称,然后自动遍历该级别。因此,例如,我想做类似的事情:
myElements = myXmlTree.findallelements("{" + ns + "}")
它会给我一个返回值,例如:
['registrationDate', 'ref', 'endAddress', 'handle', 'name', 'netBlocks', 'orgRef', 'comment', 'startAddress', 'updateDate', 'version']
如果它可以告诉我元素的整个结构,包括嵌套结构,那就特别棒了。
我敢肯定有办法,否则就没有意义了。
提前致谢!!
PS,我知道我可以迭代并遍历所有迭代的列表。我希望 lxml 中已经有一个包含这些数据的方法。如果迭代是唯一的方法,我想那没关系……对我来说似乎很笨拙。