///|
/// Parse metadata XML bytes into a cpdfmetadata-style XML tree.
///
/// This parser is intentionally scoped to the XML/XMP subset used by PDF
/// metadata: elements, attributes, namespaces, comments, processing
/// instructions, optional DTD text, text data, and predefined or numeric XML
/// entities.
pub fn pdf_metadata_xmltree_of_bytes(
  metadata : BytesView,
) -> @metadata.PdfMetadataXmlDocument raise @core.PdfError {
  let (dtd, after_dtd) = pdf_metadata_xml_parse_dtd(metadata, 0)
  let root_start = pdf_metadata_xml_skip_misc(metadata, after_dtd)
  guard root_start < metadata.length() && metadata[root_start].to_int() == 60 else {
    raise BadText
  }
  let (tree, after_tree) = pdf_metadata_xml_parse_element(
    metadata,
    root_start,
    [],
  )
  let end = pdf_metadata_xml_skip_misc(metadata, after_tree)
  guard end == metadata.length() else { raise BadText }
  { dtd, tree, }
}

///|
/// Source-spelled compatibility alias for cpdfmetadata's `xmltree_of_bytes`.
pub fn pdf_xmltree_of_bytes(
  metadata : BytesView,
) -> @metadata.PdfMetadataXmlDocument raise @core.PdfError {
  pdf_metadata_xmltree_of_bytes(metadata)
}