0

I want to get all the user names from xml file and it is using namespace

I have a XML file like this :

<?xml version="1.0" encoding="utf-8"?>
<account xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <Names>
        <Name>
            <FirstName>John</FirstName>
            <LastName>Smith</LastName>
        </Name>
        <Name>
            <FirstName>James</FirstName>
            <LastName>White</LastName>
        </Name>
    </Names>
</account>
vineel
  • 3,483
  • 2
  • 29
  • 33

2 Answers2

2

Her is simple xml linq solution

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

namespace ConsoleApp2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns = doc.Root.GetDefaultNamespace();

            var results = doc.Descendants(ns + "Name")
                .Select(x => new { firstName = (string)x.Element(ns + "FirstName"), lastName = (string)x.Element(ns + "LastName") })
                .ToList();
        }
    }  
}
jdweng
  • 33,250
  • 2
  • 15
  • 20
0

This is how I retrieved the element and it's innertext. Hope this will be helpful for someone in future.

public static void getUserNames()
        {
            var names = "Users: ";
            try
            {
                var xmlContent = @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <account xmlns=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"">
                     <Names>
                            <Name>
                                <FirstName>John</FirstName>
                                <LastName>Smith</LastName>
                            </Name>
                            <Name>
                                <FirstName>James</FirstName>
                                <LastName>White</LastName>
                            </Name>
                        </Names>
                    </account>";
                //var xmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?><account xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"><Names><Name><FirstName>John</FirstName><LastName>Smith</LastName></Name><Name><FirstName>James</FirstName><LastName>White</LastName></Name></Names></account>";                
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(new System.IO.StringReader(xmlContent));
                XmlNamespaceManager manager = new XmlNamespaceManager(xDoc.NameTable);
                manager.AddNamespace("ns1", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");
                var query = "//ns1:Name";
                XmlNodeList nodeList = xDoc.SelectNodes(query, manager);
                for (int i = 0; i < nodeList.Count; i++)
                {
                    var node = (XmlNode)nodeList[i];
                    names += $"{node["FirstName"].InnerText} {node["LastName"].InnerText}, ";
                }
                if (!string.IsNullOrEmpty(names))
                    names = names.Substring(0, names.Length - 2);
                Console.WriteLine(names);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error processing xml", ex);
            };
        }
vineel
  • 3,483
  • 2
  • 29
  • 33
  • This isn't a good answer. Out of dozens of lines, the only relevant part is `manager.AddNamespace("ns1", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); var query = "//ns1:Name"; XmlNodeList nodeList = xDoc.SelectNodes(query, manager);`. That's already shown in several duplicate questions – Panagiotis Kanavos Aug 26 '22 at 12:38