///|
fn pdf_metadata_xml_parse_element(
  data : BytesView,
  start : Int,
  context : ArrayView[(String, String)],
) -> (@metadata.PdfMetadataXmlTree, Int) raise @core.PdfError {
  let (qualified_name, tag, child_context, self_closing, after_tag) = pdf_metadata_xml_parse_start_tag(
    data, start, context,
  )
  if self_closing {
    (PdfMetadataXmlElement(tag, []), after_tag)
  } else {
    let children : Array[@metadata.PdfMetadataXmlTree] = []
    let mut index = after_tag
    let mut closed = false
    while !closed {
      guard index < data.length() else { raise BadText }
      if pdf_metadata_view_matches_at(data, index, b"= 0 { next_tag } else { data.length() }
        match pdf_metadata_decode_xml_text(data[index:data_end]) {
          Some(text) if text != "" => children.push(PdfMetadataXmlData(text))
          Some(_) => ()
          None => raise InvalidUTF8
        }
        index = data_end
      }
    }
    (PdfMetadataXmlElement(tag, children), index)
  }
}