Espacios de nombres de XElement (¿Cómo?)

Cómo crear un documento xml con prefijo de nodo como:

      

Cuando trato de ejecutar algo así como new XElement("sphinx:docset") excepción

Excepción no controlada: System.Xml.XmlException: el carácter ‘:’, valor hexadecimal 0x3A, no se puede incluir en un nombre.
en System.Xml.XmlConvert.VerifyNCName (String name, ExceptionType exceptionTyp e)
en System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
en System.Xml.Linq.XNamespace.GetName (String localName)
en System.Xml.Linq.XName.Get (String expandedName)

Es realmente fácil en LINQ a XML:

 XNamespace ns = "sphinx"; XElement element = new XElement(ns + "docset"); 

O para que el “alias” funcione correctamente para que se vea como sus ejemplos, algo como esto:

 XNamespace ns = "http://url/for/sphinx"; XElement element = new XElement("container", new XAttribute(XNamespace.Xmlns + "sphinx", ns), new XElement(ns + "docset", new XElement(ns + "schema"), new XElement(ns + "field", new XAttribute("name", "subject")), new XElement(ns + "field", new XAttribute("name", "content")), new XElement(ns + "attr", new XAttribute("name", "published"), new XAttribute("type", "timestamp")))); 

Eso produce:

         

Puede leer el espacio de nombre de su documento y usarlo en consultas como esta:

 XDocument xml = XDocument.Load(address); XNamespace ns = xml.Root.Name.Namespace; foreach (XElement el in xml.Descendants(ns + "whateverYourElementNameIs")) //do stuff