public Book Load(Stream stream)
        {
            // attempt validation if we are sure it won't interfere
            if (stream.CanSeek)
            {
                // validate the
                Stream schema = Assembly.GetExecutingAssembly().GetManifestResourceStream("Medius.Model.book.xsd");
                var v = new XmlValidator();
                if (!v.Validate(schema, stream))
                {
                    throw new InvalidDataException(
                        "Could not load book XML.\r\nCause(s):\r\n" +
                            string.Join("\r\n", v.Errors.Select(
                                e => string.Format(
                                    "Line {0} Col {1}: {2}", e.Line, e.Column, e.Message
                                    )
                                )
                            )
                        );
                }

                // rewind the stream
                stream.Seek(0, SeekOrigin.Begin);
            }

            // I am aware that this is embarrasingly simple.
            // it's called code reuse. (it's also called error-prone.)
            return (Book)new XmlSerializer(typeof(Book)).Deserialize(stream);
        }
        public Project Import(string inputFilename)
        {
            Book book;
            using (Stream output = new MemoryStream())
            {
                // read WP XML file
                using (Stream wpFile = new FileStream(inputFilename, FileMode.Open))
                using (Stream xslt = Assembly.GetExecutingAssembly().GetManifestResourceStream("Medius.Controllers.wp2book.xsl"))
                {
                    // transform stream to stream
                    XmlTransformer.Transform(xslt, wpFile, output);
                }

                // rewind and validate
                output.Seek(0, SeekOrigin.Begin);
                using (Stream xsd = Assembly.GetExecutingAssembly().GetManifestResourceStream("Medius.Model.book.xsd"))
                {
                    XmlValidator validator = new XmlValidator();
                    if (!validator.Validate(xsd, output))
                    {
                        throw new InvalidDataException(
                        "Could not load book XML.\r\nCause(s):\r\n" +
                            string.Join("\r\n", validator.Errors.Select(
                                e => string.Format(
                                    "Line {0} Col {1}: {2}", e.Line, e.Column, e.Message
                                    )
                                )
                            )
                        );
                    }
                }

                // rewind again and deserialize
                output.Seek(0, SeekOrigin.Begin);
                book = books.Load(output);
            }

            Project project = new Project();
            project.Book = book;
            return project;
        }