private static EpubMetadataMeta ReadMetadataMetaVersion3(XmlNode metadataMetaNode) { EpubMetadataMeta result = new EpubMetadataMeta(); foreach (XmlAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes) { string attributeValue = metadataMetaNodeAttribute.Value; switch (metadataMetaNodeAttribute.Name.ToLowerInvariant()) { case "id": result.Id = attributeValue; break; case "refines": result.Refines = attributeValue; break; case "property": result.Property = attributeValue; break; case "scheme": result.Scheme = attributeValue; break; } } result.Content = metadataMetaNode.InnerText; return result; }
private static async System.Threading.Tasks.Task<EpubMetadata> ReadMetadataAsync(XmlReader reader, EpubVersion epubVersion) { EpubMetadata result = new EpubMetadata(); result.Titles = new List<string>(); result.Creators = new List<EpubMetadataCreator>(); result.Subjects = new List<string>(); result.Publishers = new List<string>(); result.Contributors = new List<EpubMetadataContributor>(); result.Dates = new List<EpubMetadataDate>(); result.Types = new List<string>(); result.Formats = new List<string>(); result.Identifiers = new List<EpubMetadataIdentifier>(); result.Sources = new List<string>(); result.Languages = new List<string>(); result.Relations = new List<string>(); result.Coverages = new List<string>(); result.Rights = new List<string>(); result.MetaItems = new List<EpubMetadataMeta>(); //Parsing all metadata insides and saving it in EpubMetadata instance // //Мне нужно пройтись по всем нодам внутри метадаты последовательно, извлечь ноды указанные в массиве metadataNodesNames... //... и сохранить их в структуре EpubMetadata //В каждой итерации нам нужно извлечь имя нода, сделать маленькими буквами и, // в зависимости от того есть ли он в массиве - выполнить запись в структуру //ИЛИ мы можем тупо искать по заданным в массиве именам, с опасностью, что какая-то сука написала капсами и это ебнет весь ридер // bool isMetadataAvailable = await reader.ReadToFollowingAsync("metadata", "http://www.idpf.org/2007/opf"); if (!isMetadataAvailable) throw new Exception("EPUB parsing error: metadata not found in the package."); while (await reader.ReadAsync() && !(reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "metadata")) { switch (reader.NodeType) { case XmlNodeType.Element: switch (reader.LocalName.ToLowerInvariant()) { case "title": result.Titles.Add(reader.ReadElementContentAsString()); break; case "creator": EpubMetadataCreator creator = new EpubMetadataCreator(); creator.Role = reader.GetAttribute("opf:role"); creator.FileAs = reader.GetAttribute("opf:file-as"); creator.Creator = reader.ReadElementContentAsString(); result.Creators.Add(creator); break; case "subject": result.Subjects.Add(reader.ReadElementContentAsString()); break; case "description": result.Description = reader.ReadElementContentAsString(); break; case "publisher": result.Publishers.Add(reader.ReadElementContentAsString()); break; case "contributor": EpubMetadataContributor contributor = new EpubMetadataContributor(); contributor.Role = reader.GetAttribute("opf:role"); contributor.FileAs = reader.GetAttribute("opf:file-as"); contributor.Contributor = reader.ReadElementContentAsString(); result.Contributors.Add(contributor); break; case "date": EpubMetadataDate date = new EpubMetadataDate(); date.Event = reader.GetAttribute("opf:event"); date.Date = reader.ReadElementContentAsString(); result.Dates.Add(date); break; case "type": result.Types.Add(reader.ReadElementContentAsString()); break; case "format": result.Formats.Add(reader.ReadElementContentAsString()); break; case "identifier": EpubMetadataIdentifier identifier = new EpubMetadataIdentifier(); identifier.Id = reader.GetAttribute("id"); identifier.Scheme = reader.GetAttribute("opf:scheme"); identifier.Identifier = reader.ReadElementContentAsString(); result.Identifiers.Add(identifier); break; case "source": result.Sources.Add(reader.ReadElementContentAsString()); break; case "language": result.Languages.Add(reader.ReadElementContentAsString()); break; case "relation": result.Relations.Add(reader.ReadElementContentAsString()); break; case "coverage": result.Coverages.Add(reader.ReadElementContentAsString()); break; case "rights": result.Rights.Add(reader.ReadElementContentAsString()); break; //looks like there is an optional refining node "meta" and it is present in EPUB3 case "meta": if (epubVersion == EpubVersion.EPUB_2) { EpubMetadataMeta meta = new EpubMetadataMeta(); meta.Name = reader.GetAttribute("name"); meta.Content = reader.GetAttribute("content"); result.MetaItems.Add(meta); } else if (epubVersion == EpubVersion.EPUB_3) { EpubMetadataMeta meta = new EpubMetadataMeta(); meta.Id = reader.GetAttribute("id"); meta.Refines = reader.GetAttribute("refines"); meta.Property = reader.GetAttribute("property"); meta.Scheme = reader.GetAttribute("scheme"); meta.Content = reader.ReadElementContentAsString(); result.MetaItems.Add(meta); } break; } break; } } return result; }
private static EpubMetadataMeta ReadMetadataMetaVersion2(XmlNode metadataMetaNode) { EpubMetadataMeta result = new EpubMetadataMeta(); foreach (XmlAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes) { string attributeValue = metadataMetaNodeAttribute.Value; switch (metadataMetaNodeAttribute.Name.ToLowerInvariant()) { case "name": result.Name = attributeValue; break; case "content": result.Content = attributeValue; break; } } return result; }