Python XML 从 CDATA 之间的文件中获取 IP

标签 python xml

我有一个 XML 转储文件,我想解析它以查找第一次出现的“ETH0_IP”。然而,cdata 字段让我很困惑。它最终返回“无”。文件中还出现了其他 IP,但我不关心这些。

到目前为止我有这样的事情:

  q = etree.parse(outputfile)
  fileoutputip = q.findtext("ETH0_IP")

这是 XML:

<VM>
  <ID>####</ID>
  <UID>0</UID>
  <GID>0</GID>
  <UNAME>####</UNAME>
  <GNAME>###</GNAME>
  <NAME>###</NAME>
  <PERMISSIONS>
    <OWNER_U>1</OWNER_U>
    <OWNER_M>1</OWNER_M>
    <OWNER_A>0</OWNER_A>
    <GROUP_U>0</GROUP_U>
    <GROUP_M>0</GROUP_M>
    <GROUP_A>0</GROUP_A>
    <OTHER_U>0</OTHER_U>
    <OTHER_M>0</OTHER_M>
    <OTHER_A>0</OTHER_A>
  </PERMISSIONS>
  <LAST_POLL>1461191030</LAST_POLL>
  <STATE>3</STATE>
  <LCM_STATE>3</LCM_STATE>
  <PREV_STATE>3</PREV_STATE>
  <PREV_LCM_STATE>3</PREV_LCM_STATE>
  <RESCHED>0</RESCHED>
  <STIME>1461189864</STIME>
  <ETIME>0</ETIME>
  <DEPLOY_ID>###</DEPLOY_ID>
  <MEMORY>###</MEMORY>
  <CPU>0</CPU>
  <NET_TX>1000</NET_TX>
  <NET_RX>73254</NET_RX>
  <TEMPLATE>
    <AUTOMATIC_REQUIREMENTS><![CDATA[!(PUBLIC_CLOUD = YES)]]></AUTOMATIC_REQUIREMENTS>
    <CONTEXT>
      <DISK_ID><![CDATA[1]]></DISK_ID>
      <ETH0_DNS><![CDATA[####]]></ETH0_DNS>
      <ETH0_GATEWAY><![CDATA[###]]></ETH0_GATEWAY>
      <ETH0_IP><![CDATA[10.**.***.**]]></ETH0_IP>

最佳答案

q.findtext("ETH0_IP") 会尝试直接在树中的根元素下查找 ETH0_IP 元素,在本例中它会导致 None,因为 VM 没有直接的 ETH0_IP 子级。

您可以通过向 find()findtext() 提供 XPath 表达式(在树中的任意位置查找 ETH0_IP 元素)来解决此问题,或直接使用 xpath() 方法:

>>> from lxml import etree
>>> 
>>> tree = etree.parse("input.xml")
>>> print(tree.find(".//ETH0_IP").text)
10.**.***.**
>>> print(tree.findtext(".//ETH0_IP"))
10.**.***.**
>>> print(tree.xpath("//ETH0_IP")[0].text)
10.**.***.**

关于Python XML 从 CDATA 之间的文件中获取 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36756350/

相关文章:

python - CPLEX 的 Python 中的 Bender 分解示例

java - 使用 JaxB 编码实现公共(public)接口(interface)的对象列表

c# - 带有 IXmlSerializable 的命名空间前缀

python - 使用 Pytorch API 和 Fast-ai 进行分类的训练结果不同

xml - 具有多个可选子元素和公共(public)必需元素的 xsd

php - 移动服务器破坏了 MySQL 数据库驱动的谷歌地图

android - 如何缩写一个TextView?

python - 在QGraphicsItem上添加动画时遇到的一个问题

python - 解码 7 位 GSM

python - Py.test - 基于 session 的设置