/**
 * Récupérer toutes les informations dans un fichier DocBook.
 * @param string $filename nom du fichier à analyser
 * @return object DocInfos objet contenant les infos de l'article, ou un tableau de chaînes contenant des messages d'erreurs
 * @todo Relire le code, il ne vérifie parfois pas assez les données d'entrées/les erreurs qui peuvent survenir pendant le traitement.
 */
function docbookGetArticleInfoFromFile($filename)
{
    $doc = new DocInfos();
    /* Extrait du XML toutes les informations pour remplir la classe Article */
    /* Obtenir un arbre à partir du fichier XML */
    $xmltree = new XML_Tree($filename);
    /* lecture du fichier qui récupère la balise <article> */
    $article = $xmltree->getTreeFromFile();
    if ($xmltree->isError($article)) {
        $erreur = $article->getUserInfo();
        if ($erreur == '') {
            $erreur = 'probablement un document mal formé';
        }
        return array('Impossible de parser le fichier XML (' . $erreur . ')');
    }
    preg_match('/^\\s*<\\?xml(.*?)encoding="(.+?)"/', file_get_contents($filename), $charset);
    $charset = $charset[2];
    $doc->repertoire = _toUtf8($charset, trim($article->getAttribute("id")));
    $doc->type = _toUtf8($charset, array_key_exists("role", $article->attributes) ? $article->getAttribute("role") : "article");
    $doc->lang = _toUtf8($charset, array_key_exists("lang", $article->attributes) ? $article->getAttribute("lang") : "fr");
    $artinfonode = getElementsByTagName($article, "articleinfo");
    if (count($artinfonode) == 0) {
        return array('Impossible de continuer à parser le fichier XML : il manque la section articleinfo du docbook');
    }
    /* Traitement particulier pour les balises <author> */
    $auteurs = array();
    foreach (getElementsByTagName($artinfonode[0], "author") as $author) {
        $firstnames = getElementsByTagName($author, "firstname");
        $surnames = getElementsByTagName($author, "surname");
        $auteurs[] = (count($firstnames) ? ucfirst(trim(tree2text($firstnames[0]))) : "") . ' ' . (count($surnames) ? ucfirst(trim(tree2text($surnames[0]))) : "");
    }
    $doc->auteurs = _toUtf8($charset, implode(', ', $auteurs));
    $doc->classement = array();
    foreach ($artinfonode[0]->children as $child) {
        /* Récupération des balises <title>, <pubdate> et <date> */
        if (!strcmp($child->name, "title")) {
            $doc->titre = _toUtf8($charset, tree2text($child));
        }
        if (!strcmp($child->name, "titleabbrev")) {
            $doc->titremini = _toUtf8($charset, tree2text($child));
        }
        if (!strcmp($child->name, "pubdate")) {
            $doc->pubdate = _toUtf8($charset, tree2text($child));
        }
        if (!strcmp($child->name, "date")) {
            $doc->update = _toUtf8($charset, tree2text($child));
        }
        if (!strcmp($child->name, "subjectset")) {
            foreach (getElementsByTagName($child, "subject") as $subjnode) {
                $attribute = _toUtf8($charset, $subjnode->getAttribute("role"));
                $doc->classement[$attribute] = array();
                foreach (getElementsByTagName($subjnode, "subjectterm") as $entry) {
                    $doc->classement[$attribute][] = _toUtf8($charset, tree2text($entry));
                }
            }
        }
        if (!strcmp($child->name, "abstract")) {
            $doc->accroche = _toUtf8($charset, tree2text($child));
        }
    }
    return $doc;
}