/// ------------------------------------------------------------------------------------ public string GetXmlForWork(Work work) { var bldr = new StringBuilder(); if (work != null) { bldr.Append(GetOlacRecordElement()); foreach (var contributor in work.Contributions) bldr.Append(GetContributorElement(contributor.Role.Code, contributor.ContributorName)); bldr.Append("</olac:olac>"); } return bldr.ToString(); /* <dc:language xsi:type="olac:language" olac:code="adz" view="Adzera"/> <dc:subject xsi:type="olac:language" olac:code="adz" view="Adzera"/> <dc:title>Language</dc:title> <dc:publisher>New York: Holt</dc:publisher> */ }
public void TypicalEmbedInMyXmlDocument() { var system = new OlacSystem(); var work = new Work(); work.Licenses.Add(License.CreativeCommons_Attribution_ShareAlike); work.Contributions.Add(new Contribution("Charlie Brown", system.GetRoleByCodeOrThrow("author"))); work.Contributions.Add(new Contribution("Linus", system.GetRoleByCodeOrThrow("editor"))); string metaData = system.GetXmlForWork(work); //Embed that data in our own file using (var f = new TempFile(@"<doc> <metadata>" + metaData + @"</metadata> <ourDocumentContents>blah blah<ourDocumentContents/></doc>")) { //Then when it comes time to read the file, we can extract out the work again var dom = new XmlDocument(); dom.Load(f.Path); var node = dom.SelectSingleNode("//metadata"); var work2 = new Work(); system.LoadWorkFromXml(work2, node.InnerXml); Assert.AreEqual(2,work2.Contributions.Count()); } }
/// ------------------------------------------------------------------------------------ public void LoadWorkFromXml(Work work, string xml) { //TODO: parse the xml as olac. For a first pass, we can ignore anything we don't understand. //Eventually, we'll want to round-trip things we don't understand. Guard.AgainstNull(work, "Work"); var doc = XDocument.Load(XmlReader.Create(new StringReader(xml))); foreach (var contributor in doc.Descendants((new XElement(s_nsDc + "contributor")).Name)) { Role role = GetRoles().ElementAt(0); var roleCode = contributor.Attributes().Single(a => a.Name == s_nsOlac + "code").Value; TryGetRoleByCode(roleCode, out role); work.Contributions.Add(new Contribution(contributor.Value, role)); } }