public void ConfigurationFieldTest()
        {
            var xmlNodeDef = XmlNodeDefinition.Create("test", "/root/test", i => new
            {
                Prop1 = i.ToXPathQuery <DateTime>("azer1"),
                Prop2 = i.ToXPathQuery <int>("azer2"),
                Prop3 = i.ToXPathQuery <string>("azer3"),
                Prop4 = i.ToXPathQuery <decimal>("azer4"),
                Prop5 = i.ToXPathQuery <bool>("azer5"),
            });

            CollectionAssert.AreEquivalent(
                new[] { "azer1", "azer2", "azer3", "azer4", "azer5" },
                xmlNodeDef.GetXmlFieldDefinitions().Select(i => i.NodePath).ToArray());
            CollectionAssert.AreEquivalent(
                new[] { "Prop1", "Prop2", "Prop3", "Prop4", "Prop5" },
                xmlNodeDef.GetXmlFieldDefinitions().Select(i => i.TargetPropertyInfo.Name).ToArray());
            CollectionAssert.AreEquivalent(
                new[] { typeof(DateTime), typeof(int), typeof(string), typeof(decimal), typeof(bool) },
                xmlNodeDef.GetXmlFieldDefinitions().Select(i => i.TargetPropertyInfo.PropertyType).ToArray());
        }
        public void TestReadXml()
        {
            var xml = @"
                <books>
                  <collection name='col1'>
                    <caracs size='6546' />
                    <book publisher='Addison-Wesley'>
                      <title>The Mythical Man Month</title>
<prout/>
                      <author>Frederick Brooks</author>
                      <id>1</id>
                    </book>
                    <loanedbook publisher='IDG books' on-loan='Sanjay'>
                      <title>XML Bible</title>
<prout/>
                      <author>Elliotte Rusty Harold</author>
                      <id>2</id>
                    </loanedbook>
                  </collection>
                  <collection name='col2'>
                    <caracs size='524' />
                    <book publisher='APress'>
                      <title>A Programmer's Introduction to C#</title>
<prout/>
                      <author>Eric Gunnerson</author>
                      <id>3</id>
                    </book>
                    <loanedbook publisher='Prentice Hall' on-loan='Sander'>
                      <title>Definitive XML Schema</title>
<prout/>
                      <author>Priscilla Walmsley</author>
                      <id>4</id>
                    </loanedbook>
                    <book publisher='WROX'>
                      <title>Professional XSLT 2nd Edition</title>
<prout/>
                      <author>Michael Kay</author>
                      <id>5</id>
                    </book>
                  </collection>
                  <collection name='col3'>
                    <book publisher='APress'>
                      <title>A Programmer's Introduction to C#</title>
<prout/>
                      <author>Eric Gunnerson</author>
                      <id>6</id>
                    </book>
                    <loanedbook publisher='Prentice Hall' on-loan='Sander'>
                      <title>Definitive XML Schema</title>
<prout/>
                      <author>Priscilla Walmsley</author>
                      <id>7</id>
                    </loanedbook>
                  </collection>
                  <collection>
                    <caracs size='3' />
                    <book publisher='WROX'>
                      <title>Professional XSLT 2nd Edition</title>
<prout/>
                      <author>Michael Kay</author>
                      <id>8</id>
                    </book>
                  </collection>
                </books>";
            var bookNodeDefinition = XmlNodeDefinition.Create("book", "/books/collection/book", i => new BookTest
            {
                Id             = i.ToXPathQuery <int>("/books/collection/book/id"),
                Author         = i.ToXPathQuery <string>("/books/collection/book/author"),
                Publisher      = i.ToXPathQuery <string>("/books/collection/book/@publisher"),
                Title          = i.ToXPathQuery <string>("/books/collection/book/title"),
                CollectionName = i.ToXPathQuery <string>("/books/collection/@name"),
                CollectionSize = i.ToXPathQuery <int>("/books/collection/caracs/@size", -1)
            });
            var loanedBookNodeDefinition = XmlNodeDefinition.Create("loanedbook", "/books/collection/loanedbook", i => new LoanedBookTest
            {
                Id             = i.ToXPathQuery <int>("/books/collection/loanedbook/id"),
                Author         = i.ToXPathQuery <string>("/books/collection/loanedbook/author"),
                Publisher      = i.ToXPathQuery <string>("/books/collection/loanedbook/@publisher"),
                Title          = i.ToXPathQuery <string>("/books/collection/loanedbook/title"),
                Loaner         = i.ToXPathQuery <string>("/books/collection/loanedbook/@on-loan"),
                CollectionName = i.ToXPathQuery <string>("/books/collection/@name"),
                CollectionSize = i.ToXPathQuery <int>("/books/collection/caracs/@size", -1)
            });
            List <XmlNodeParsed> xmlNodeParseds  = new List <XmlNodeParsed>();
            XmlObjectReader      xmlObjectReader = new XmlObjectReader(new XmlFileDefinition().AddNodeDefinition(bookNodeDefinition).AddNodeDefinition(loanedBookNodeDefinition));

            xmlObjectReader.Read(GenerateStreamFromString(xml), xmlNodeParseds.Add);
            CollectionAssert.AreEquivalent(new[] { "book", "loanedbook", "book", "loanedbook", "book", "book", "loanedbook", "book" }, xmlNodeParseds.Select(i => i.NodeDefinitionName).ToArray());
            CollectionAssert.AreEquivalent(new[] { typeof(BookTest), typeof(LoanedBookTest), typeof(BookTest), typeof(LoanedBookTest), typeof(BookTest), typeof(BookTest), typeof(LoanedBookTest), typeof(BookTest) }, xmlNodeParseds.Select(i => i.Type).ToArray());

            var book0 = xmlNodeParseds[0].GetValue <BookTest>();

            Assert.AreEqual(1, book0.Id);
            Assert.AreEqual("Addison-Wesley", book0.Publisher);
            Assert.AreEqual("The Mythical Man Month", book0.Title);
            Assert.AreEqual("Frederick Brooks", book0.Author);
            Assert.AreEqual("col1", book0.CollectionName);
            Assert.AreEqual(6546, book0.CollectionSize);

            var book1 = xmlNodeParseds[1].GetValue <LoanedBookTest>();

            Assert.AreEqual(2, book1.Id);
            Assert.AreEqual("Sanjay", book1.Loaner);
            Assert.AreEqual("IDG books", book1.Publisher);
            Assert.AreEqual("XML Bible", book1.Title);
            Assert.AreEqual("Elliotte Rusty Harold", book1.Author);
            Assert.AreEqual("col1", book1.CollectionName);
            Assert.AreEqual(6546, book1.CollectionSize);

            var book2 = xmlNodeParseds[2].GetValue <BookTest>();

            Assert.AreEqual(3, book2.Id);
            Assert.AreEqual("APress", book2.Publisher);
            Assert.AreEqual("A Programmer's Introduction to C#", book2.Title);
            Assert.AreEqual("Eric Gunnerson", book2.Author);
            Assert.AreEqual("col2", book2.CollectionName);
            Assert.AreEqual(524, book2.CollectionSize);

            var book3 = xmlNodeParseds[3].GetValue <LoanedBookTest>();

            Assert.AreEqual(4, book3.Id);
            Assert.AreEqual("Sander", book3.Loaner);
            Assert.AreEqual("Prentice Hall", book3.Publisher);
            Assert.AreEqual("Definitive XML Schema", book3.Title);
            Assert.AreEqual("Priscilla Walmsley", book3.Author);
            Assert.AreEqual("col2", book3.CollectionName);
            Assert.AreEqual(524, book3.CollectionSize);

            var book4 = xmlNodeParseds[4].GetValue <BookTest>();

            Assert.AreEqual(5, book4.Id);
            Assert.AreEqual("WROX", book4.Publisher);
            Assert.AreEqual("Professional XSLT 2nd Edition", book4.Title);
            Assert.AreEqual("Michael Kay", book4.Author);
            Assert.AreEqual("col2", book4.CollectionName);
            Assert.AreEqual(524, book4.CollectionSize);

            var book5 = xmlNodeParseds[5].GetValue <BookTest>();

            Assert.AreEqual(6, book5.Id);
            Assert.AreEqual("APress", book5.Publisher);
            Assert.AreEqual("A Programmer's Introduction to C#", book5.Title);
            Assert.AreEqual("Eric Gunnerson", book5.Author);
            Assert.AreEqual("col3", book5.CollectionName);
            Assert.AreEqual(0, book5.CollectionSize);

            var book6 = xmlNodeParseds[6].GetValue <LoanedBookTest>();

            Assert.AreEqual(7, book6.Id);
            Assert.AreEqual("Sander", book6.Loaner);
            Assert.AreEqual("Prentice Hall", book6.Publisher);
            Assert.AreEqual("Definitive XML Schema", book6.Title);
            Assert.AreEqual("Priscilla Walmsley", book6.Author);
            Assert.AreEqual("col3", book6.CollectionName);
            Assert.AreEqual(0, book6.CollectionSize);

            var book7 = xmlNodeParseds[7].GetValue <BookTest>();

            Assert.AreEqual(8, book7.Id);
            Assert.AreEqual("WROX", book7.Publisher);
            Assert.AreEqual("Professional XSLT 2nd Edition", book7.Title);
            Assert.AreEqual("Michael Kay", book7.Author);
            Assert.AreEqual(null, book7.CollectionName);
            Assert.AreEqual(3, book7.CollectionSize);
        }
        public static IStream <TOut> CrossApplyXmlFile <TIn, TOut>(this IStream <TIn> stream, string name, XmlNodeDefinition <TOut> xmlNodeDefinitions, Func <TIn, string> filePathSelector, IDictionary <string, string> prefixToUriNamespaces = null, bool noParallelisation = false)
        {
            var valuesProvider = new XmlFileValuesProvider <TIn, TOut, TOut>(new XmlFileValuesProviderArgs <TIn, TOut, TOut>()
            {
                PrefixToUriNamespaces = prefixToUriNamespaces,
                DataStreamSelector    = i => File.OpenRead(filePathSelector(i)),
                XmlNodeDefinition     = xmlNodeDefinitions,
                ResultSelector        = (i, o) => o
            });

            return(stream.CrossApply <TIn, TOut>(name, valuesProvider.PushValues, noParallelisation));
        }
        public static IStream <TOut> CrossApplyXmlFile <TParsed, TOut>(this IStream <Stream> stream, string name, XmlNodeDefinition <TParsed> xmlNodeDefinitions, Func <TParsed, TOut> resultSelector, IDictionary <string, string> prefixToUriNamespaces = null, bool noParallelisation = false)
        {
            var valuesProvider = new XmlFileValuesProvider <Stream, TParsed, TOut>(new XmlFileValuesProviderArgs <Stream, TParsed, TOut>()
            {
                PrefixToUriNamespaces = prefixToUriNamespaces,
                DataStreamSelector    = i => i,
                XmlNodeDefinition     = xmlNodeDefinitions,
                ResultSelector        = (s, o) => resultSelector(o)
            });

            return(stream.CrossApply <Stream, TOut>(name, valuesProvider.PushValues, noParallelisation));
        }
        public static IStream <TOut> CrossApplyXmlFile <TOut>(this IStream <LocalFilesValue> stream, string name, XmlNodeDefinition <TOut> xmlNodeDefinitions, IDictionary <string, string> prefixToUriNamespaces = null, bool noParallelisation = false)
        {
            var valuesProvider = new XmlFileValuesProvider <LocalFilesValue, TOut, TOut>(new XmlFileValuesProviderArgs <LocalFilesValue, TOut, TOut>()
            {
                PrefixToUriNamespaces = prefixToUriNamespaces,
                DataStreamSelector    = i => i.GetContent(),
                XmlNodeDefinition     = xmlNodeDefinitions,
                ResultSelector        = (i, o) => o
            });

            return(stream.CrossApply <LocalFilesValue, TOut>(name, valuesProvider.PushValues, noParallelisation));
        }