コード例 #1
0
 private XmlDocument GetXmlFromStream(MIMETypedStream stream)
 {
     if (stream.MIMEType == "text/xml")
     {
         XmlDocument doc = new XmlDocument();
         doc.Load(new MemoryStream(stream.stream));
         return(doc);
     }
     return(null);
 }
コード例 #2
0
        // retorna o histórico de um pid por ordem decrescente (do mais recente para o mais antigo) da data de registo
        public List <Historico> GetHistoric(string pid)
        {
            List <Historico> result = new List <Historico>();

            foreach (Datastream ds in manager.getDatastreamHistory(pid, "METS"))
            {
                XmlDocument         metsDoc;
                XmlNamespaceManager nameSpaceManager;

                MIMETypedStream stream = service.getDatastreamDissemination(pid, "METS", ds.createDate);
                metsDoc          = GetXmlFromStream(stream);
                nameSpaceManager = new XmlNamespaceManager(metsDoc.NameTable);
                nameSpaceManager.AddNamespace("mets", "http://www.loc.gov/METS/");
                nameSpaceManager.AddNamespace("xlink", "http://www.w3.org/TR/xlink/");

                // Get author and log message from METS file
                string        user       = "";
                List <string> logMsg     = new List <string>();
                XmlNode       headerNode = metsDoc.SelectSingleNode("//mets:agent", nameSpaceManager);

                if (headerNode != null)
                {
                    if (headerNode.SelectSingleNode("mets:name", nameSpaceManager) != null)
                    {
                        user = headerNode.SelectSingleNode("mets:name", nameSpaceManager).InnerText;
                    }

                    if (headerNode.SelectNodes("mets:note", nameSpaceManager) != null)
                    {
                        foreach (XmlNode node in headerNode.SelectNodes("mets:note", nameSpaceManager))
                        {
                            logMsg.Add(node.InnerText);
                        }
                    }
                }

                result.Add(new Historico(ds.createDate, user, logMsg.ToArray()));
            }
            return(result);
        }
コード例 #3
0
ファイル: FedoraHandler.cs プロジェクト: aureliopires/gisa
 private XmlDocument GetXmlFromStream(MIMETypedStream stream) {
     if (stream.MIMEType == "text/xml") {
         XmlDocument doc = new XmlDocument();
         doc.Load(new MemoryStream(stream.stream));
         return doc;
     }
     return null;
 }
コード例 #4
0
        public ObjDigital GetStructureForPid(string pid, string originalTimestamp, bool loadVersions)
        {
            XmlDocument         metsDoc;
            XmlDocument         dcDoc;
            XmlNamespaceManager nameSpaceManager;
            XmlNamespaceManager dcNameSpaceManager;
            string versionTimestamp = null;

            try {
                versionTimestamp = manager.getDatastream(pid, "METS", originalTimestamp).createDate;

                MIMETypedStream stream = service.getDatastreamDissemination(pid, "METS", originalTimestamp);
                metsDoc          = GetXmlFromStream(stream);
                nameSpaceManager = new XmlNamespaceManager(metsDoc.NameTable);
                nameSpaceManager.AddNamespace("mets", "http://www.loc.gov/METS/");
                nameSpaceManager.AddNamespace("xlink", "http://www.w3.org/TR/xlink/");

                // Temos de pedir o DC mais próximo da versão mais actualizada do METS (logo passamos o versionTimestamp)
                MIMETypedStream dcStream = service.getDatastreamDissemination(pid, "DC", versionTimestamp);
                dcDoc = GetXmlFromStream(dcStream);
                dcNameSpaceManager = new XmlNamespaceManager(dcDoc.NameTable);
                dcNameSpaceManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
                dcNameSpaceManager.AddNamespace("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/");
                dcNameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            } catch (Exception ex) { throw new Exception("Datastreams METS e/ou DC inválidos para o objecto " + pid + ".", ex); }

            try {
                XmlNode structMap = metsDoc.SelectSingleNode("mets:mets/mets:structMap", nameSpaceManager);
                XmlNode mainDiv   = structMap.SelectSingleNode("mets:div", nameSpaceManager);
                XmlNode recordID  = metsDoc.SelectSingleNode("mets:mets/mets:metsHdr/mets:altRecordID", nameSpaceManager);

                string type;
                try { type = structMap.Attributes["TYPE"].Value.ToString().ToUpper(); } catch { type = "PHYSICAL"; }
                ObjDigital newDocumentType = null;
                if (type == "LOGICAL")
                {
                    newDocumentType             = new ObjDigComposto();
                    newDocumentType.state       = State.unchanged;
                    newDocumentType.serverState = GetState(pid);
                    ObjDigSimples[] parts = new ObjDigSimples[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count];

                    foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager))
                    {
                        // Ler objecto directamente
                        XmlNode       fptr       = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager);
                        ObjDigSimples objSimples = GetStructureForPid(fptr.Attributes["FILEID"].Value, originalTimestamp, true) as ObjDigSimples;
                        parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = objSimples;
                    }

                    ((ObjDigComposto)newDocumentType).objSimples.AddRange(parts);
                }
                else
                {
                    newDocumentType             = new ObjDigSimples();
                    newDocumentType.state       = State.unchanged;
                    newDocumentType.serverState = GetState(pid);
                    Anexo[] parts = new Anexo[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count];

                    foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager))
                    {
                        XmlNode fptr  = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager);
                        Anexo   anexo = new Anexo();

                        anexo.pid          = pid;
                        anexo.dataStreamID = fptr.Attributes["FILEID"].Value;
                        anexo.mimeType     = subDiv.Attributes["TYPE"].Value;
                        parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = anexo;

                        try
                        {
                            Datastream data = manager.getDatastream(pid, anexo.dataStreamID, null);
                            anexo.url      = data.location;
                            anexo.checksum = data.checksum;
                        }
                        catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("URL de datastream " + anexo.dataStreamID + " no objecto " + pid + " não foi encontrado.", ex); }
                    }

                    ((ObjDigSimples)newDocumentType).nextDatastreamId = service.listDatastreams(pid, null).Count(ds => ds.ID.Contains("IMG")) + 1;
                    ((ObjDigSimples)newDocumentType).fich_associados.AddRange(parts);

                    if (loadVersions)
                    {
                        ((ObjDigSimples)newDocumentType).historico.AddRange(GetHistoric(pid));
                    }
                }

                newDocumentType.pid     = pid;
                newDocumentType.version = versionTimestamp;
                newDocumentType.titulo  = mainDiv.Attributes["LABEL"].Value;
                if (mainDiv.Attributes["TYPE"] != null)
                {
                    newDocumentType.tipologia = mainDiv.Attributes["TYPE"].Value;
                }
                if (recordID != null)  // há objetos que não têm gisa_id
                {
                    newDocumentType.gisa_id = recordID.InnerText;
                }
                else
                {
                    newDocumentType.gisa_id = "";
                }

                XmlNodeList assuntos = dcDoc.SelectNodes("oai_dc:dc/dc:subject", dcNameSpaceManager);
                if (assuntos.Count > 0)
                {
                    List <string> listAssuntos = new List <string>();
                    foreach (XmlNode node in assuntos)
                    {
                        listAssuntos.Add(node.InnerText);
                    }
                    newDocumentType.assuntos = listAssuntos;
                }

                return(newDocumentType);
            }
            catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("Erro ao analisar objecto " + pid + ".", ex); }
        }