} // Test03

        /// <summary>
        /// Generates a NewsItem based on the reference example LISTING_2-modPower_NewsML-G2_Text_Document.xml.
        /// It tests a) adding element from an "other" namespace to itemMeta and contentMeta
        /// and b) adding the <itemClass> element to the contentMeta where it must not exist by the NewsML-G2 XML schema.
        /// </summary>
        private static void Test04()
        {
            // Generic variables
            Exception                  ex1;
            LxDateTime                 lxdt;
            ConceptNameTypeCt          name;
            TruncatedDateTimeTypeUnion dtvaltdtt;

            NewsItemElm newsItem = new NewsItemElm();

            newsItem.Standard        = "NewsML-G2";
            newsItem.Standardversion = "2.27";
            newsItem.Guid            = "urn:newsml:acmenews.com:20161121:US-FINANCE-FED";
            newsItem.Version         = 11;
            newsItem.Conformance     = "power";

            // Adding 2 catalogRef-s:
            CatalogRefElm catalogRef = new CatalogRefElm();

            catalogRef.Href = "http://www.iptc.org/std/catalog/catalog.IPTC-G2-Standards_30.xml";
            newsItem.CatalogRef.Add(catalogRef);

            // Adding rightsInfo - bubble up
            CopyrightHolderElm copyrightHolder = new CopyrightHolderElm();

            copyrightHolder.Uri = "http://www.acmenews.com/about.html#copyright";
            name       = new ConceptNameTypeCt();
            name.Value = "Acme News and Media LLC";
            copyrightHolder.Name.Add(name);
            CopyrightNoticeElm copyrightNotice = new CopyrightNoticeElm();

            copyrightNotice.Add("Copyright 2016-17 Acme News and Media LLC");
            RightsInfoTypeCt rightsInfo = new RightsInfoTypeCt();

            rightsInfo.CopyrightHolder = copyrightHolder;
            rightsInfo.CopyrightNotice.Add(copyrightNotice);
            newsItem.RightsInfo.Add(rightsInfo);

            // Adding itemMeta properties
            newsItem.ItemMeta.ItemClass.Qcode = "ninat:text";
            lxdt = LxDateTime.CreateDateTime(2017, 11, 21, 16, 25, 32, 0, 0, 0, -5, 0);
            newsItem.ItemMeta.VersionCreated.Value = lxdt;
            newsItem.ItemMeta.Provider.Uri         = "http://www.acmenews.com/about/";

            QualPropTypeCt pubStatus = new QualPropTypeCt();

            pubStatus.Qcode             = "stat:usable";
            newsItem.ItemMeta.PubStatus = pubStatus;

            // TEST: create an element in an "other" namespace and add it to the extension point of itemMeta
            XNamespace specdNs     = "http://example.org/ns/specialdata01";
            XElement   specdAlarm1 = new XElement(specdNs + "alarm", new XText("This news item should be published instantly"));

            newsItem.ItemMeta.AnyElement.Add(specdAlarm1);

            // Adding contentMeta properties
            ContentMetadataAfDTypeCt contentMeta = new ContentMetadataAfDTypeCt(); // = the wrapper

            if (LxDateTime.TryParseXSDDateTime("2016-11-21T15:21:06-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentCreated = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                  = new TruncatedDateTimeTypeUnion(lxdt);
                contentCreated.Value       = dtvaltdtt;
                contentMeta.ContentCreated = contentCreated;
            }

            if (LxDateTime.TryParseXSDDateTime("2017-11-21T16:22:45-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentModified = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                   = new TruncatedDateTimeTypeUnion(lxdt);
                contentModified.Value       = dtvaltdtt;
                contentMeta.ContentModified = contentModified;
            }


            HeadlineElm headline = new HeadlineElm();

            headline.Value = "Testing, testing, testing";
            contentMeta.Headline.Add(headline);

            // TEST: create an element in an "other" namespace and add it to the extension point of contentMeta
            XNamespace addldNs       = "http://example.org/ns/additionaldata01";
            XElement   addldHeadline = new XElement(addldNs + "ourHeadline", new XText("Look at this special news item"));

            contentMeta.AnyElement.Add(addldHeadline);

            // TEST: create an element defined as child of itemMeta and try to add it to the extension point of contentMeta
            // Attempt 1:
            ItemClassElm itemClassWrong1 = new ItemClassElm();

            itemClassWrong1.Qcode = "blabla:anything";
            // contentMeta.AnyElement.Add(itemClassWrong1); // this line of code cannot be compiled, wrong data type

            // Attempt 2: build the <itemClass> as generic XElement
            XNamespace narNs           = "http://iptc.org/std/nar/2006-10-01/";
            XElement   itemClassWrong2 = new XElement(narNs + "itemClass", new XAttribute("qcode", "blabla:anything"));

            // the line of code below generates an <itemClass> element as child of <contentMeta>: this is invalid by the NewsML-G2 schema
            contentMeta.AnyElement.Add(itemClassWrong2);

            // finally: add the filled contentMeta instance to the newsItem
            newsItem.ContentMeta = contentMeta;

            // Adding an empty contentSet
            ContentSetElm contentSet = new ContentSetElm();

            newsItem.ContentSet = contentSet;

            // final action of the test procedure: serialized the XML document and create an output
            LxSerializer <NewsItemElm> serializer1 = new LxSerializer <NewsItemElm>();

            using (StringWriter sw = new StringWriter())
            {
                serializer1.Serialize(sw, newsItem);
                Console.WriteLine(sw.ToString());
                // ValidateNG2newsItem(sw.ToString()); // calling it throws an exception
            }

            using (StreamWriter outputSw = new StreamWriter(Path.Combine(testOutputDir, "test04-generated.xml")))
            {
                serializer1.Serialize(outputSw, newsItem);
                Console.WriteLine("!! Test results file test04-generated.xml was generated");
            }
            Console.WriteLine("!!!!! Test04 closes");
        } // Test04
        /// <summary>
        /// Generates a NewsItem complying to the reference example LISTING_2-modPower_NewsML-G2_Text_Document.xml.
        /// The sequence of generating nodes/elements follows the sequence in the example XML document.
        /// </summary>
        private static void Test01()
        {
            // Generic variables
            Exception                  ex1;
            LxDateTime                 lxdt;
            ConceptNameTypeCt          name;
            TruncatedDateTimeTypeUnion dtvaltdtt;

            NewsItemElm newsItem = new NewsItemElm();

            newsItem.Standard        = "NewsML-G2";
            newsItem.Standardversion = "2.27";
            newsItem.Guid            = "urn:newsml:acmenews.com:20161121:US-FINANCE-FED";
            newsItem.Version         = 11;
            newsItem.Conformance     = "power";

            // Adding 2 catalogRef-s:
            CatalogRefElm catalogRef = new CatalogRefElm();

            catalogRef.Href = "http://www.iptc.org/std/catalog/catalog.IPTC-G2-Standards_30.xml";
            newsItem.CatalogRef.Add(catalogRef);
            catalogRef      = new CatalogRefElm();
            catalogRef.Href = "http://catalog.acmenews.com/news/ANM_G2_CODES_2.xml";
            newsItem.CatalogRef.Add(catalogRef);

            // Adding rightsInfo - bubble up
            CopyrightHolderElm copyrightHolder = new CopyrightHolderElm();

            copyrightHolder.Uri = "http://www.acmenews.com/about.html#copyright";
            name       = new ConceptNameTypeCt();
            name.Value = "Acme News and Media LLC";
            copyrightHolder.Name.Add(name);
            CopyrightNoticeElm copyrightNotice = new CopyrightNoticeElm();

            copyrightNotice.Add("Copyright 2016-17 Acme News and Media LLC");
            RightsInfoTypeCt rightsInfo = new RightsInfoTypeCt();

            rightsInfo.CopyrightHolder = copyrightHolder;
            rightsInfo.CopyrightNotice.Add(copyrightNotice);
            newsItem.RightsInfo.Add(rightsInfo);

            // Adding itemMeta properties
            newsItem.ItemMeta.ItemClass.Qcode = "ninat:text";
            lxdt = LxDateTime.CreateDateTime(2017, 11, 21, 16, 25, 32, 0, 0, 0, -5, 0);
            newsItem.ItemMeta.VersionCreated.Value = lxdt;
            newsItem.ItemMeta.Provider.Uri         = "http://www.acmenews.com/about/";

            QualPropTypeCt pubStatus = new QualPropTypeCt();

            pubStatus.Qcode             = "stat:usable";
            newsItem.ItemMeta.PubStatus = pubStatus;

            // Adding contentMeta properties
            ContentMetadataAfDTypeCt contentMeta = new ContentMetadataAfDTypeCt(); // = the wrapper

            if (LxDateTime.TryParseXSDDateTime("2016-11-21T15:21:06-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentCreated = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                  = new TruncatedDateTimeTypeUnion(lxdt);
                contentCreated.Value       = dtvaltdtt;
                contentMeta.ContentCreated = contentCreated;
            }

            if (LxDateTime.TryParseXSDDateTime("2017-11-21T16:22:45-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentModified = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                   = new TruncatedDateTimeTypeUnion(lxdt);
                contentModified.Value       = dtvaltdtt;
                contentMeta.ContentModified = contentModified;
            }

            FlexLocationPropTypeCt located = new FlexLocationPropTypeCt();

            located.Qcode = "geoloc:NYC";
            name          = new ConceptNameTypeCt();
            name.Value    = "New York, NY";
            located.Name.Add(name);
            contentMeta.Located.Add(located);

            FlexAuthorPropTypeCt creator = new FlexAuthorPropTypeCt();

            creator.Uri = "http://www.acmenews.com/staff/mjameson";
            name        = new ConceptNameTypeCt();
            name.Value  = "Meredith Jameson";
            creator.Name.Add(name);
            contentMeta.Creator1.Add(creator); // .Creator = @creator, .Creator1 = /creator

            Flex1PartyPropTypeCt infoSource = new Flex1PartyPropTypeCt();

            infoSource.Qcode = "is:AP";
            name             = new ConceptNameTypeCt();
            name.Value       = "Associcated Press";
            infoSource.Name.Add(name);
            contentMeta.InfoSource.Add(infoSource);

            LanguageElm language = new LanguageElm();

            language.Tag = "en-US";
            contentMeta.Language.Add(language);

            // a sequence of subject elements
            SubjectElm subject = new SubjectElm();

            subject.Qcode = "medtop:04000000";
            name          = new ConceptNameTypeCt();
            name.Value    = "economy, business and finance";
            subject.Name.Add(name);
            contentMeta.Subject.Add(subject);

            subject       = new SubjectElm();
            subject.Qcode = "medtop:20000350";
            name          = new ConceptNameTypeCt();
            name.Value    = "central bank";
            subject.Name.Add(name);
            contentMeta.Subject.Add(subject);

            subject       = new SubjectElm();
            subject.Qcode = "medtop:20000379";
            name          = new ConceptNameTypeCt();
            name.Value    = "money and monetary policy";
            subject.Name.Add(name);
            contentMeta.Subject.Add(subject);

            SluglineElm slugline = new SluglineElm();

            slugline.Value = "US-Finance-Fed";
            contentMeta.Slugline.Add(slugline);

            HeadlineElm headline = new HeadlineElm();

            headline.Value = "Fed to halt QE to avert \"bubble\"";
            contentMeta.Headline.Add(headline);

            // finally: add the filled contentMeta instance to the newsItem
            newsItem.ContentMeta = contentMeta;

            // Adding contentSet
            ContentSetElm contentSet = new ContentSetElm();

            // (create the XML tree outside the NewsML-G2 schema - in the IPTC NITF namespace
            XNamespace nitfNs = "http://iptc.org/std/NITF/2006-10-18/";
            XElement   nitf   = new XElement(nitfNs + "nitf",
                                             new XElement(nitfNs + "body",
                                                          new XElement(nitfNs + "body.head",
                                                                       new XElement(nitfNs + "hedline",
                                                                                    new XElement(nitfNs + "hl1", new XText("Fed to halt QE to avert \"bubble\""))
                                                                                    ),
                                                                       new XElement(nitfNs + "byline", new XText("By Meredith Jameson, Staff Reporter"))
                                                                       ),
                                                          new XElement(nitfNs + "body.content",
                                                                       new XElement(nitfNs + "p", new XText("(New York, NY - October 21) Et, sent luptat luptat, commy Nim zzriureet vendreetue modo etc")),
                                                                       new XElement(nitfNs + "p", new XText("Ugiating ea feugait utat, venim velent nim quis nulluptat num Volorem inci enim dolobor eetuer sendre ercin utpatio dolorpercing"))
                                                                       )
                                                          )
                                             );

            ContentSetElm.InlineXMLElm inlineXml = new ContentSetElm.InlineXMLElm();
            inlineXml.AnyElement = nitf;
            contentSet.InlineXML.Add(inlineXml);
            newsItem.ContentSet = contentSet;

            // final action of the test procedure: serialized the XML document and create an output
            LxSerializer <NewsItemElm> serializer1 = new LxSerializer <NewsItemElm>();

            using (StringWriter sw = new StringWriter())
            {
                serializer1.Serialize(sw, newsItem);
                Console.WriteLine(sw.ToString());
            }
            using (StreamWriter outputSw = new StreamWriter(Path.Combine(testOutputDir, "test01-LISTING_2-generated.xml")))
            {
                serializer1.Serialize(outputSw, newsItem);
                Console.WriteLine("!! Test results file test01-LISTING_2-generated.xml was generated");
            }
            Console.WriteLine("!!!!! Test01 closes");
        } // Test01
        } // Test02

        /// <summary>
        /// Generates a NewsItem based on the reference example LISTING_2-modPower_NewsML-G2_Text_Document.xml.
        /// It tests adding metadata properties to a wrapper after having added the wrapper to the node tree.
        /// </summary>
        private static void Test03()
        {
            // Generic variables
            Exception                  ex1;
            LxDateTime                 lxdt;
            ConceptNameTypeCt          name;
            TruncatedDateTimeTypeUnion dtvaltdtt;

            NewsItemElm newsItem = new NewsItemElm();

            newsItem.Standard        = "NewsML-G2";
            newsItem.Standardversion = "2.27";
            newsItem.Guid            = "urn:newsml:acmenews.com:20161121:US-FINANCE-FED";
            newsItem.Version         = 11;
            newsItem.Conformance     = "power";

            // Adding 2 catalogRef-s:
            CatalogRefElm catalogRef = new CatalogRefElm();

            catalogRef.Href = "http://www.iptc.org/std/catalog/catalog.IPTC-G2-Standards_30.xml";
            newsItem.CatalogRef.Add(catalogRef);
            catalogRef      = new CatalogRefElm();
            catalogRef.Href = "http://catalog.acmenews.com/news/ANM_G2_CODES_2.xml";
            newsItem.CatalogRef.Add(catalogRef);

            // Adding rightsInfo - bubble up
            CopyrightHolderElm copyrightHolder = new CopyrightHolderElm();

            copyrightHolder.Uri = "http://www.acmenews.com/about.html#copyright";
            name       = new ConceptNameTypeCt();
            name.Value = "Acme News and Media LLC";
            copyrightHolder.Name.Add(name);
            CopyrightNoticeElm copyrightNotice = new CopyrightNoticeElm();

            copyrightNotice.Add("Copyright 2016-17 Acme News and Media LLC");
            RightsInfoTypeCt rightsInfo = new RightsInfoTypeCt();

            rightsInfo.CopyrightHolder = copyrightHolder;
            rightsInfo.CopyrightNotice.Add(copyrightNotice);
            newsItem.RightsInfo.Add(rightsInfo);

            // Adding itemMeta properties
            newsItem.ItemMeta.ItemClass.Qcode = "ninat:text";
            lxdt = LxDateTime.CreateDateTime(2017, 11, 21, 16, 25, 32, 0, 0, 0, -5, 0);
            newsItem.ItemMeta.VersionCreated.Value = lxdt;
            newsItem.ItemMeta.Provider.Uri         = "http://www.acmenews.com/about/";

            QualPropTypeCt pubStatus = new QualPropTypeCt();

            pubStatus.Qcode             = "stat:usable";
            newsItem.ItemMeta.PubStatus = pubStatus;

            // Adding contentMeta properties
            ContentMetadataAfDTypeCt contentMeta = new ContentMetadataAfDTypeCt(); // = the wrapper

            if (LxDateTime.TryParseXSDDateTime("2016-11-21T15:21:06-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentCreated = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                  = new TruncatedDateTimeTypeUnion(lxdt);
                contentCreated.Value       = dtvaltdtt;
                contentMeta.ContentCreated = contentCreated;
            }

            if (LxDateTime.TryParseXSDDateTime("2017-11-21T16:22:45-05:00", out lxdt, out ex1))
            {
                TruncatedDateTimePropTypeCt contentModified = new TruncatedDateTimePropTypeCt();
                dtvaltdtt                   = new TruncatedDateTimeTypeUnion(lxdt);
                contentModified.Value       = dtvaltdtt;
                contentMeta.ContentModified = contentModified;
            }

            FlexLocationPropTypeCt located = new FlexLocationPropTypeCt();

            located.Qcode = "geoloc:NYC";
            name          = new ConceptNameTypeCt();
            name.Value    = "New York, NY";
            located.Name.Add(name);
            contentMeta.Located.Add(located);

            FlexAuthorPropTypeCt creator = new FlexAuthorPropTypeCt();

            creator.Uri = "http://www.acmenews.com/staff/mjameson";
            name        = new ConceptNameTypeCt();
            name.Value  = "Meredith Jameson";
            creator.Name.Add(name);
            contentMeta.Creator1.Add(creator); // .Creator = @creator, .Creator1 = /creator

            Flex1PartyPropTypeCt infoSource = new Flex1PartyPropTypeCt();

            infoSource.Qcode = "is:AP";
            name             = new ConceptNameTypeCt();
            name.Value       = "Associcated Press";
            infoSource.Name.Add(name);
            contentMeta.InfoSource.Add(infoSource);

            LanguageElm language = new LanguageElm();

            language.Tag = "en-US";
            contentMeta.Language.Add(language);

            // only 1 subject element
            SubjectElm subject = new SubjectElm();

            subject.Qcode = "medtop:04000000";
            name          = new ConceptNameTypeCt();
            name.Value    = "economy, business and finance";
            subject.Name.Add(name);
            contentMeta.Subject.Add(subject);

            SluglineElm slugline = new SluglineElm();

            slugline.Value = "US-Finance-Fed";
            contentMeta.Slugline.Add(slugline);

            HeadlineElm headline = new HeadlineElm();

            headline.Value = "Fed to halt QE to avert \"bubble\"";
            contentMeta.Headline.Add(headline);

            // add the filled contentMeta instance to the newsItem
            newsItem.ContentMeta = contentMeta;

            // Adding an empty contentSet wrapper
            ContentSetElm contentSet = new ContentSetElm();

            // TEST: 2nd round of metadata activities:
            // remove a subject from contentMeta
            newsItem.ContentMeta.Subject.RemoveAt(0);
            // TEST: Now add contentMeta properties
            subject       = new SubjectElm();
            subject.Qcode = "medtop:20000350";
            name          = new ConceptNameTypeCt();
            name.Value    = "central bank";
            subject.Name.Add(name);
            newsItem.ContentMeta.Subject.Add(subject);

            subject       = new SubjectElm();
            subject.Qcode = "medtop:20000379";
            name          = new ConceptNameTypeCt();
            name.Value    = "money and monetary policy";
            subject.Name.Add(name);
            newsItem.ContentMeta.Subject.Add(subject);

            // TEST: Now add itemMeta properties
            BlockTypeCt edNote = new BlockTypeCt();

            edNote.Value = "Hello, dear NewsML-G2 testers. We hope you enjoy the results.";

            newsItem.ItemMeta.EdNote.Add(edNote);

            // final action of the test procedure: serialized the XML document and create an output
            LxSerializer <NewsItemElm> serializer1 = new LxSerializer <NewsItemElm>();

            using (StringWriter sw = new StringWriter())
            {
                serializer1.Serialize(sw, newsItem);
                Console.WriteLine(sw.ToString());
            }
            using (StreamWriter outputSw = new StreamWriter(Path.Combine(testOutputDir, "test03-generated.xml")))
            {
                serializer1.Serialize(outputSw, newsItem);
                Console.WriteLine("!! Test results file test03-generated.xml was generated");
            }
            Console.WriteLine("!!!!! Test03 closes");
        } // Test03