Universal robot description format (URDF) describes the kinematic chain of a rigid-body structure and is widely used to specify a robot structure in a number of simulators including ROS-Gazebo and MuJoCo. It is in an xml format and following is an example of Panda from Franka Emika.
<?xml version='1.0'?>
<robot name="panda" xmlns:xacro="http://www.ros.org/wiki/xacro">
<link name="world">
</link>
<link name="base_link">
</link>
<joint name="world_fixed" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="world"/>
<child link="base_link"/>
</joint>
<joint name="root_base" type="fixed">
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="link0"/>
</joint>
<link name="link0">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link0.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link0.stl"/>
</geometry>
</collision>
</link>
<link name="link1">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link1.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link1.stl"/>
</geometry>
</collision>
</link>
<joint name="joint1" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
<origin rpy="0 0 0" xyz="0 0 0.333"/>
<parent link="link0"/>
<child link="link1"/>
<axis xyz="0 0 1"/>
<limit effort="87" lower="-2.9671" upper="2.9671" velocity="2.3925"/>
</joint>
<link name="link2">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link2.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link2.stl"/>
</geometry>
</collision>
</link>
<joint name="joint2" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-1.7628" soft_upper_limit="1.7628"/>
<origin rpy="-1.570796325 0 0" xyz="0 0 0"/>
<parent link="link1"/>
<child link="link2"/>
<axis xyz="0 0 1"/>
<limit effort="87" lower="-1.8326" upper="1.8326" velocity="2.3925"/>
</joint>
<link name="link3">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link3.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link3.stl"/>
</geometry>
</collision>
</link>
<joint name="joint3" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
<origin rpy="1.570796325 0 0" xyz="0 -0.316 0"/>
<parent link="link2"/>
<child link="link3"/>
<axis xyz="0 0 1"/>
<limit effort="87" lower="-2.9671" upper="2.9671" velocity="2.3925"/>
</joint>
<link name="link4">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link4.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link4.stl"/>
</geometry>
</collision>
</link>
<joint name="joint4" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-3.0718" soft_upper_limit="0.0175"/>
<origin rpy="1.570796325 0 0" xyz="0.0825 0 0"/>
<parent link="link3"/>
<child link="link4"/>
<axis xyz="0 0 1"/>
<limit effort="87" lower="-3.1416" upper="0.0873" velocity="2.3925"/>
</joint>
<link name="link5">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link5.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link5.stl"/>
</geometry>
</collision>
</link>
<joint name="joint5" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
<origin rpy="-1.570796325 0 0" xyz="-0.0825 0.384 0"/>
<parent link="link4"/>
<child link="link5"/>
<axis xyz="0 0 1"/>
<limit effort="12" lower="-2.9671" upper="2.9671" velocity="2.8710"/>
</joint>
<link name="link6">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link6.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link6.stl"/>
</geometry>
</collision>
</link>
<joint name="joint6" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-0.0175" soft_upper_limit="3.7525"/>
<origin rpy="1.570796325 0 0" xyz="0 0 0"/>
<parent link="link5"/>
<child link="link6"/>
<axis xyz="0 0 1"/>
<limit effort="12" lower="-0.0873" upper="3.8223" velocity="2.8710"/>
</joint>
<link name="link7">
<visual>
<geometry>
<mesh filename="package://franka_description/meshes/visual/panda_link7.stl"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://franka_description/meshes/collision/panda_link7.stl"/>
</geometry>
</collision>
</link>
<joint name="joint7" type="revolute">
<safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
<origin rpy="1.570796325 0 0" xyz="0.088 0 0"/>
<parent link="link6"/>
<child link="link7"/>
<axis xyz="0 0 1"/>
<limit effort="12" lower="-2.9671" upper="2.9671" velocity="2.8710"/>
</joint>
<joint name="hand" type="fixed">
<origin rpy="0 0 0" xyz="0 0 0.107"/>
<parent link="link7"/>
<child link="link8"/>
<axis xyz="0 0 1"/>
</joint>
<link name="link8">
</link>
</robot>
While the contained fields vary from one to the other, there are two important fields: joint and link.
The joint field usually contains name, type, origin, parent, child, axis, and so forth. Understandably, name contains the number of joint (e.g., joint1). Type contains the type of actuation such as fixed, or revolute. Origin tells us the offset of the joint to its parent joint in terms of both position and rotations in Euler angles. Parent and child contain the name of the links, not joint itself. For example, if the kinematic chain looks like world-joint1-link1-joint2-link2, then the parent and child of joint1 are world and link1, and the parent and child of joint2 are link1 and link2, respectively. Axis contains the axis of rotation and we can use the Rodrigues' rotation formula to get the corresponding rotation.
The link field usually contains name, the moment of inertia, mesh information, collision information, and so forth. It is often the case when only name and mesh information are given. When given visual->origin field, it serves as position and rotation offsets of the link mesh with respect to the joint whose child link is the current link. In other words, if joint1 has link1 as its child than the offsets of link1 are applied with respect to the position and orientation of joint1. It may sounds complicated, but it is in fact pretty straightforward. Other information such as mass and the moment of inertia are often given to compute dynamic properties in simulations. Collision models are often given as a CAD file (.stl) with simpler structures (e.g., convex shape or capsule).