web-dev-qa-db-fra.com

Espaces de noms XElement (Comment?)

Comment créer un document xml avec un préfixe de nœud comme:

<sphinx:docset>
  <sphinx:schema>
    <sphinx:field name="subject"/>
    <sphinx:field name="content"/>
    <sphinx:attr name="published" type="timestamp"/>
 </sphinx:schema>

Quand j'essaye d'exécuter quelque chose comme new XElement("sphinx:docset") j'obtiens une exception

Exception non gérée: System.Xml.XmlException: le caractère ":", valeur hexadécimale 0x3A, ne peut pas être inclus dans un nom.
sur System.Xml.XmlConvert.VerifyNCName (nom de chaîne, ExceptionType exceptionTyp e)
sur System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
sur System.Xml.Linq.XNamespace.GetName (String localName)
sur System.Xml.Linq.XName.Get (String ExpandName)

69
Edward83

C'est très simple dans LINQ to XML:

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

Ou pour que "l'alias" fonctionne correctement pour qu'il ressemble à vos exemples, quelque chose comme ceci:

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

Cela produit:

<container xmlns:sphinx="http://url/for/sphinx">
  <sphinx:docset>
    <sphinx:schema />
    <sphinx:field name="subject" />
    <sphinx:field name="content" />
    <sphinx:attr name="published" type="timestamp" />
  </sphinx:docset>
</container>
113
Jon Skeet

Vous pouvez lire l'espace de noms de votre document et l'utiliser dans des requêtes comme celle-ci:

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