如何解析 python 中的 xml 字符串属性

how to parse xml string attribute in python

我有这个有点复杂的 xml 文件。

<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from catkin_ws/src/steer_bot/steer_bot_description/urdf/steer_bot.urdf.xacro | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->



<robot name="steer_bot">
  
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="dark_gray">
    <color rgba="0.5 0.5 0.5 1"/>
  </material>
  <material name="gray">
    <color rgba="0.753 0.753 0.753 1"/>
  </material>
  <!-- Gazebo plugins -->
  <gazebo>
    <!-- Load ros_control plugin using the steer_bot_hardware_gazebo
    implementation of the hardware_interface::RobotHW -->
    <plugin filename="libgazebo_ros_control.so" name="gazebo_ros_control">
      <robotNamespace>/steer_bot</robotNamespace>
      <legacyModeNS>false</legacyModeNS>
    </plugin>
  </gazebo>
  <!-- Base link -->
  <link name="base_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="0.5 0.3 0.1"/>
      </geometry>
      <material name="green"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <box size="0.5 0.3 0.1"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="5"/>
      <inertia ixx="0.041666666666666664" ixy="0.0" ixz="0.0" iyy="0.10833333333333334" iyz="0.0" izz="0.14166666666666664"/>
    </inertial>
  </link>
  <link name="front_steer_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
      <material name="yellow"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="0.0006583333333333334" ixy="0.0" ixz="0.0" iyy="0.0006583333333333334" iyz="0.0" izz="0.0012500000000000002"/>
    </inertial>
  </link>
  <joint name="front_steer_joint" type="revolute">
    <parent link="base_link"/>
    <child link="front_steer_link"/>
    <origin rpy="0 0 0" xyz="0.2 0 0.16999999999999998"/>
    <axis xyz="0 0 1"/>
    <limit effort="10.0" lower="-3.141592653589793" upper="3.141592653589793" velocity="5.0"/>
  </joint>
  
  <gazebo reference="front_steer_link">
    <material>Gazebo/Yellow</material>
  </gazebo>
  <link name="rear_wheel_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.04" radius="0.0375"/>
      </geometry>
      <material name="yellow"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.04" radius="0.0375"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="0.03125"/>
      <inertia ixx="1.5152994791666665e-05" ixy="0.0" ixz="0.0" iyy="1.5152994791666665e-05" iyz="0.0" izz="2.197265625e-05"/>
    </inertial>
  </link>
  <joint name="rear_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="rear_wheel_link"/>
    <origin rpy="-1.5707963267948966 0 0" xyz="-0.2 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>
 
  <gazebo reference="rear_wheel_link">
    <material>Gazebo/Yellow</material>
  </gazebo>
  <link name="front_right_steer_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
      <material name="blue"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="0.0006583333333333334" ixy="0.0" ixz="0.0" iyy="0.0006583333333333334" iyz="0.0" izz="0.0012500000000000002"/>
    </inertial>
  </link>
  <joint name="front_right_steer_joint" type="revolute">
    <parent link="base_link"/>
    <child link="front_right_steer_link"/>
    <origin rpy="0 0 0" xyz="0.2 -0.2 0.16999999999999998"/>
    <axis xyz="0 0 1"/>
    <limit effort="10.0" lower="-0.7853981633974483" upper="0.7853981633974483" velocity="5.0"/>
  </joint>
  <link name="front_right_wheel_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.08" radius="0.15"/>
      </geometry>
      <material name="red"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.08" radius="0.15"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="0.0061583333333333325" ixy="0.0" ixz="0.0" iyy="0.0061583333333333325" iyz="0.0" izz="0.01125"/>
    </inertial>
  </link>
  <joint name="front_right_wheel_joint" type="continuous">
    <parent link="front_right_steer_link"/>
    <child link="front_right_wheel_link"/>
    <origin rpy="-1.5707963267948966 0 0" xyz="0 0 -0.16999999999999998"/>
    <axis xyz="0 0 1"/>
  </joint>
  
  <gazebo reference="front_right_steer_link">
    <material>Gazebo/Blue</material>
  </gazebo>
  <gazebo reference="front_right_wheel_link">
    <material>Gazebo/Red</material>
  </gazebo>
  <link name="front_left_steer_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
      <material name="blue"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.02" radius="0.05"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="0.0006583333333333334" ixy="0.0" ixz="0.0" iyy="0.0006583333333333334" iyz="0.0" izz="0.0012500000000000002"/>
    </inertial>
  </link>
  <joint name="front_left_steer_joint" type="revolute">
    <parent link="base_link"/>
    <child link="front_left_steer_link"/>
    <origin rpy="0 0 0" xyz="0.2 0.2 0.16999999999999998"/>
    <axis xyz="0 0 1"/>
    <limit effort="10.0" lower="-0.7853981633974483" upper="0.7853981633974483" velocity="5.0"/>
  </joint>
  <link name="front_left_wheel_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.08" radius="0.15"/>
      </geometry>
      <material name="red"/>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.08" radius="0.15"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="0.0061583333333333325" ixy="0.0" ixz="0.0" iyy="0.0061583333333333325" iyz="0.0" izz="0.01125"/>
    </inertial>
  </link>
  <joint name="front_left_wheel_joint" type="continuous">
    <parent link="front_left_steer_link"/>
    <child link="front_left_wheel_link"/>
    <origin rpy="-1.5707963267948966 0 0" xyz="0 0 -0.16999999999999998"/>
    <axis xyz="0 0 1"/>
  </joint>
<robot>

我想从中提取 <link name="base_link"> 中的 box size<link name="front_right_wheel_link">

中的 radius

我尝试使用这个 python 代码,但我无法提取 radius

for base_link in root.findall('link/visual/geometry/box'):
    value = base_link.get('size')
    print(value)

rad = root.findall("radius[@name='front_right_wheel_link']/visual/geometry/cylinder")   
print(rad)

但这里 rad 只给我 [] 如果有人可以帮助我,我将不胜感激。

也许代替

radius[@name='front_right_wheel_link']/visual/geometry/cylinder

你想要

link[@name='front_right_wheel_link']/visual/geometry/cylinder/@radius

(它可能还需要一个前导“//”,但我不知道 python API)。

解决方案。

rad = root.findall("link[@name='front_right_wheel_link']/visual/geometry/cylinder")
for radius in rad:
    r = radius.attrib['radius']
    print(r)