How to parse XML with namespace

16,963

Solution 1

You can do this

XNamespace ns = XNamespace.Get("XXXX");
var listOfNames = doc.Descendants(ns + "feed")
                     .Select(x => x.Elements().First().Value).ToList();

+1 for lazyberezovsky's answer. If you need to specify the element name (name in this case) or you could have multiple name elements then you need to add a second namespace for those elements.

XNamespace ns2 = XNamespace.Get("XXXXX");
var listOfNames = doc.Root.Descendants(ns2 + "name").Select(x => x.Value).ToList();

Solution 2

With XPathSelectElements you should provide namespace manager in order to use namespaces in XPath query:

var manager = new XmlNamespaceManager(new NameTable());
manager.AddNamespace("ns2", "XXXX");
manager.AddNamespace("ns", "XXXXX"); // default namespace

var names = from n in xdoc.XPathSelectElements("//ns2:feed/ns:name", manager)
            select (string)n;

Without XPath you should use XNamespace when providing name of node to find:

XNamespace ns = "XXXXX";
XNamespace ns2 = "XXXX";

var names = from f in xdoc.Descendants(ns2 + "feed")
            select (string)f.Element(ns + "name");

Solution 3

To get rid of namespaces in XLinQ queries, use similar method mentioned below:

String xml_string = @"<ns2:feeds xmlns:ns2=""XXXX"" xmlns=""XXXXX"" version=""3.0"">
                          <ns2:feed>
                              <name>XXX</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>YYY</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>ZZZ</name>
                          </ns2:feed>
                      </ns2:feeds>";

var query = XElement.Parse(xml_string).Descendants()
           .Where(c => c.Name.LocalName.ToString() == "name")
           .ToArray();

foreach (String item in query)
{
    Console.WriteLine(item);
}
Share:
16,963
Dave Bish
Author by

Dave Bish

Kiwi software engineer, living in London. mostly doing .Net stuff.

Updated on August 25, 2022

Comments

  • Dave Bish
    Dave Bish over 1 year

    Bonjour,

    I have an xml doc:

    <ns2:feeds xmlns:ns2="XXXX" xmlns="XXXXX" version="3.0">
        <ns2:feed>
            <name>XXX</name>
        </ns2:feed>
        <ns2:feed>
            <name>XXX</name>
        </ns2:feed>
        <ns2:feed>
            <name>XXX</name>
        </ns2:feed>
    </ns2:feeds>
    

    How can I use LinqToXml to get a list of Name properties? nothing I try seems to work...

    var doc = XDocument.Load(@"feed.xml");
    
    var names = doc
    .XPathSelectElements("/*/*[localname()='feeds']") //What should the Xpath be, here?
    .Select(p => new 
    { 
        Name = p.Descendants("name").First().Value
    })
    .ToList();
    

    Is there a simple way to achieve this?

  • Henk Holterman
    Henk Holterman over 10 years
    XNamespace.Get() doesn't seem to be the best approach here.
  • keyboardP
    keyboardP over 10 years
    Usually with namespaces I've used the above but maybe it hasn't always been efficient in that case. What would be the alternate way?
  • Christopher Stevenson
    Christopher Stevenson over 10 years
    If you are really concerned about efficiency, you could parse the xml with XmlReader.
  • keyboardP
    keyboardP over 10 years
    @ChristopherStevenson - Not too concerned about efficiency in performance terms but in the way that XNameSpace.Get not being the best approach.