Spazi dei nomi XElement (come?)

Come creare un documento xml con prefisso del nodo come:

      

Quando provo a eseguire qualcosa come il new XElement("sphinx:docset") ottengo un’eccezione

Eccezione non gestita: System.Xml.XmlException: il carattere ‘:’, valore esadecimale 0x3A, non può essere incluso in un nome.
a System.Xml.XmlConvert.VerifyNCName (Nome stringa, ExceptionType exceptionTyp e)
a System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
a System.Xml.Linq.XNamespace.GetName (String localName)
a System.Xml.Linq.XName.Get (String expandedName)

È davvero facile da LINQ a XML:

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

O per fare in modo che gli “alias” funzionino correttamente per far sembrare i tuoi esempi, qualcosa del genere:

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

Ciò produce:

         

Puoi leggere lo spazio dei nomi del tuo documento e usarlo in query come questa:

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