如何解析 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)
我有这个有点复杂的 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)