Quantcast
Channel: XML, System.Xml, MSXML and XmlLite forum
Viewing all articles
Browse latest Browse all 935

XML LINQ JOINING 3 ELEMENTS

$
0
0

The details of my specific case are below. I want to JOIN 3 ELEMENTS from a Microsoft Project XML file. If you can show me the generic syntax that would be great. However I have included specifics below plus a working single join project that works.

I have a Microsoft Project 2010 XML & XSD files

I want to join  Resource --< Assignments >--- Tasks and return in memory XML.

To the Microsoft Project XSD file I added the appropriate "key" & "keyref"

<xsd:key name="ResourceUIDKey">
      <xsd:selector xpath="Resources/Resource/UID"/>
      <xsd:field xpath="UID"/>
    </xsd:key>
    <xsd:keyref name="ResourceUIDKeyRef" refer ="ResourceUIDKey">
      <xsd:selector xpath="Assignments/Assignment/ResourceUID"/>
      <xsd:field xpath="ResourceUID"/>
    </xsd:keyref>
    <xsd:key name="TaskUIDKey">
      <xsd:selector xpath="Tasks/Task/UID"/>
      <xsd:field xpath="UID"/>
      </xsd:key>
    <xsd:keyref name="TaskUIDKeyRef" refer ="TaskUIDKey">
      <xsd:selector xpath="Assignments/Assignment/TaskUID"/>
      <xsd:field xpath="TaskUID"/>
    </xsd:keyref>

I created a program to JOIN Resources and Assignments but I can't get how to link in the 3rd one which is "Tasks". I want the Task Name.

This is a console project that works

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml.Schema;

namespace TestLINQ_xml7
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlSchemaSet schemas = new XmlSchemaSet();
            schemas.Add("http://schemas.microsoft.com/project/2010", "mspdi_pj14.xsd");
            Console.WriteLine("Attempting to validate, ");
            XDocument resourceAssignmentDoc = XDocument.Load("project1.xml");

            bool errors = false;
            resourceAssignmentDoc.Validate(schemas, (o, e) => 
            {
                Console.WriteLine("{0}", e.Message);
                Console.ReadKey();
                errors = true;
            });

            Console.WriteLine("resourceAssignmentDoc {0}", errors ? "did not validate" : "validated");
            Console.ReadKey();

            if (!errors)
            {
                XElement resAss = resourceAssignmentDoc.Element("Project");
                XElement newResAss = new XElement("Root",
                    from r in resAss.Element("Resources").Elements("Resource")
                    join a in resAss.Element("Assignments").Elements("Assignment")
                    on (string)r.Element("UID") equals (string)a.Element("ResourceUID") 
                                    
                    select new XElement("Assignment",
                        new XElement("ResourceID", (string)r.Element("UID")),
                        new XElement("ResourceName", (string)r.Element("Name")),
                        new XElement("TaskUID", (string)a.Element("TaskUID")),
                        new XElement("Start", (string)a.Element("Start")),
                        new XElement("Finish", (string)a.Element("Finish")),
                        new XElement("TaskName", "XXXXXXX" ))
                );
                Console.WriteLine(newResAss);
                Console.ReadKey();
            }

        }
    }
}

Steven R. Sparks


Viewing all articles
Browse latest Browse all 935

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>