Namespaces XElement (como?)

Como criar um documento xml com prefixo de nó como:

      

Quando tento executar algo como o new XElement("sphinx:docset") estou recebendo exceção

Exceção não tratada: System.Xml.XmlException: O caractere ‘:’, valor hexadecimal 0x3A, não pode ser incluído em um nome.
em System.Xml.XmlConvert.VerifyNCName (nome da cadeia, ExceptionType exceptionTyp e)
em System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
em System.Xml.Linq.XNamespace.GetName (String localName)
em System.Xml.Linq.XName.Get (String expandedName)

É muito fácil no LINQ para XML:

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

Ou para que o “alias” funcione corretamente para que pareça com seus exemplos, algo assim:

 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")))); 

Isso produz:

         

Você pode ler o namespace do seu documento e usá-lo em consultas como esta:

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