Avatar of g_johnson
g_johnson
Flag 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.
XMLC#

Avatar of undefined
Last Comment
Fernando Soto

8/22/2022 - Mon
ASKER CERTIFIED SOLUTION
Fernando Soto

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
it_saige

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-
it_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 -Capture.JPG-saige-
g_johnson

ASKER
Thanks.
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes
Fernando Soto

Not a problem g_johnson, glad to help.