Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1273
  • Last Modified:

C# XML validation without schema

Hello everybody

I'm looking for some easy way to check all the Tags in an XML file. To see if they are properly closed and so on. So check the whole structure of the XML file without a schema.

Could somebody give me an example how to do this? I'm a noob ;)

0
socom1985
Asked:
socom1985
  • 6
  • 6
1 Solution
 
saraganiCommented:
You can do it by:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(string XmlFileContent);


or by:
xmlDoc.Load(string filename)

The load / LoadXML would throw an exception if the XML is not OK (Missing tags, invalid chars etc)
0
 
daveamourCommented:
saragani is right - here is some code implementig that idea.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ValidateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            //Valie
            string test1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person></People>";
 
            //Invalid
            string test2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person>";
 
            Console.WriteLine(IsValidXML(test1));
            Console.WriteLine(IsValidXML(test2));
 
            Console.Read();
        }
 
        static bool IsValidXML(string xmlContent)
        {
            try
            {
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
 
                doc.LoadXml(xmlContent);
            }
            catch
            {
                return false;
            }
 
            return true;
        }
    }
}

Open in new window

0
 
socom1985Author Commented:
Thanks this helps.. But can you also tell me how to get the error? I want to see the location in the file..
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
daveamourCommented:
If you want to see an error just try the attahced

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ValidateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            //Valie
            string test1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person></People>";
 
            //Invalid
            string test2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person>";
 
            Console.WriteLine(IsValidXML(test1));
            Console.WriteLine(IsValidXML(test2));
 
            Console.Read();
        }
 
        static bool IsValidXML(string xmlContent)
        {
            //try
            //{
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
 
                doc.LoadXml(xmlContent);
            //}
            //catch
            //{
                //return false;
            //}
 
            return true;
        }
    }
}

Open in new window

0
 
socom1985Author Commented:
I want to write the exeption into a string. I'm writing a tool that checks every XML File in a directory and shows all errors at the end.

I now see another problem with this method. I think it will only show me the first error in an xml. Its not a big problem but it would be great if you had another method for this problem.
0
 
daveamourCommented:
Ok I see - well we could fix the current code sample to give you the error message as a string easily enough but yes it will only give you the first error.
I don't know of any easy way of finding all errors programmatically I'm afraid.  There should be somethng somewhere you can reuse.  If not you would have to write something yourself but that would be very difficult and tedious.
0
 
socom1985Author Commented:
Hmm I see.. Ok. Then we should go with the current code sample and just the first error. Can I do a catch (Exception e) or what would you suggest?

Thanks..
0
 
socom1985Author Commented:
If i do it with Exception e and e.Message I just get "Root element is missing." but I cant see which element..
0
 
daveamourCommented:
Its a matter of coding style really but I might do it something like this...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ValidateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            //Valie
            string test1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person></People>";
 
            //Invalid
            string test2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><People><Person><Name>Dave</Name></Person>";
 
            Validator validator = new Validator();
 
            if (validator.ValidateXml(test1))
            {
                Console.WriteLine("Test1 is valid" + Environment.NewLine);
            }
            else
            {
                Console.WriteLine("Test1 is not valid: " + validator.ValidationErrorMessage + Environment.NewLine);
            }
 
            if (validator.ValidateXml(test2))
            {
                Console.WriteLine("Test2 is valid" + Environment.NewLine);
            }
            else
            {
                Console.WriteLine("Test2 is not valid: " + validator.ValidationErrorMessage + Environment.NewLine);
            }           
 
            Console.Read();
        }
    }
 
    class Validator
    {
        public string ValidationErrorMessage
        {
            get;
            set;
        }
        
        public bool ValidateXml(string xmlContent)
        {
            try
            {
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
 
                doc.LoadXml(xmlContent);
            }
            catch (Exception ex)
            {
                ValidationErrorMessage = ex.Message;
 
                return false;
            }
 
            return true;
        }
    }
}

Open in new window

0
 
daveamourCommented:
Its the Root element
0
 
socom1985Author Commented:
Thanks for the code..
I changed a random closing tag. not the root element..
0
 
daveamourCommented:
Sorry but the messages given by the parsing engine used by System.Xml.XmlDocument is out of my control I'm afraid!
0
 
socom1985Author Commented:
Thanks. That's exactly it..
0

Featured Post

Fill in the form and get your FREE NFR key NOW!

Veeam is happy to provide a FREE NFR server license to certified engineers, trainers, and bloggers.  It allows for the non‑production use of Veeam Agent for Microsoft Windows. This license is valid for five workstations and two servers.

  • 6
  • 6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now