Link to home
Start Free TrialLog in
Avatar of g_johnson
g_johnsonFlag for United States of America

asked on

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

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.
ASKER CERTIFIED SOLUTION
Avatar of Fernando Soto
Fernando Soto
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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 -User generated image-saige-
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 -User generated image-saige-
Avatar of g_johnson

ASKER

Thanks.
Not a problem g_johnson, glad to help.