How do I add the xsi and xmlns:xsi tags to an XML file using Linq in C#?

g_johnson
g_johnson used Ask the Experts™
on
I've never quite understood this and am struggling again.  I need my XML file to look like this:

<?xml version="1.0"?>

-<eTest xsi:noNamespaceSchemaLocation="eTest-Schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<GLEntries>
</eTest>

I am using this technique:

                    XDocument ardoc = new XDocument();
                    XElement eTest= new XElement("eTest");
                    ardoc.Add(eTest);
                    ardoc.Save(this._ARExpPath + "AR" + dt.Date.ToString("yyyyMMdd") + ".XML");

I don't know how to get the xsi and xmlns:xsi tags (attributes?) into the eTest element.

Thanks.
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Retired
Distinguished Expert 2017
Commented:
Hi g_johnson;

I have modified your code to add the XNamespace's
// Create the XNamespace's you need which will be added to the Root node
XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
XNamespace noNamespaceSchemaLoc = XNamespace.Get("eTest-Schema.xsd");

XDocument ardoc = new XDocument();
XElement eTest = new XElement("eTest", 
    new XAttribute(xsi + "noNamespaceSchemaLoc", noNamespaceSchemaLoc.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName));

ardoc.Add(eTest);

ardoc.Save(this._ARExpPath + "AR" + dt.Date.ToString("yyyyMMdd") + ".XML");

Open in new window

Commented:
You can also setup a type serializer to do this:
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace EE_Q28736062
{
	class Program
	{
		static void Main(string[] args)
		{
			ETestSerializer test = new ETestSerializer();
			test.GenerateXml("test.xml");
		}
	}

	[Serializable(), XmlRoot("eTest")]
	public class ETestSerializer
	{
		[XmlAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
		public string noNamespaceSchemaLocation = "eTest-Schema.xsd";

		public void GenerateXml(string fileName)
		{
			GenerateXml(new FileInfo(fileName));
		}

		public void GenerateXml(FileInfo file)
		{
			XmlSerializer serializer = new XmlSerializer(GetType());
			using (TextWriter stream = new StreamWriter(file.FullName))
			{
				XmlSerializerNamespaces spaces = new XmlSerializerNamespaces();
				spaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
				serializer.Serialize(stream, this, spaces);
			}
		}
	}
}

Open in new window

Which produces the following xml file -Capture.JPG-saige-

Commented:
And probably a little more than you were expecting but here is one way this method could be utilized in conjunction with your GLEntries (just making up an implementation):
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;

namespace EE_Q28736062
{
	class Program
	{
		static void Main(string[] args)
		{
			ETestSerializer test = new ETestSerializer();
			test.GLEntries.Add(new GLEntry() { ID = 1, Name = "First" });
			test.GenerateXml("test.xml");
		}
	}

	[Serializable(), XmlRoot("eTest")]
	public class ETestSerializer
	{
		private readonly List<GLEntry> fGLEntries = new List<GLEntry>();

		[XmlAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
		public string noNamespaceSchemaLocation = "eTest-Schema.xsd";

		[XmlElement()]
		public List<GLEntry> GLEntries { get { return fGLEntries; } }

		public void GenerateXml(string fileName)
		{
			GenerateXml(new FileInfo(fileName));
		}

		public void GenerateXml(FileInfo file)
		{
			XmlSerializer serializer = new XmlSerializer(GetType());
			using (TextWriter stream = new StreamWriter(file.FullName))
			{
				XmlSerializerNamespaces spaces = new XmlSerializerNamespaces();
				spaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
				serializer.Serialize(stream, this, spaces);
			}
		}
	}

	[Serializable()]
	public class GLEntry
	{
		public int ID { get; set; }
		public string Name { get; set; }
	}
}

Open in new window

Which now produces the following output -Capture.JPG-saige-

Author

Commented:
Thanks.
Fernando SotoRetired
Distinguished Expert 2017

Commented:
Not a problem g_johnson, glad to help.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial