2009-07-21 11 views
0

J'ai rencontré un problème: lors de la création par programmation d'un document XML à l'aide des classes System.Xml et de l'utilisation de la méthode Save, le code XML de sortie n'utilise pas de nom Q pour le Nodes et utilise simplement les noms locaux.XmlDocument.Save ne génère pas de noms QNames complets pour les éléments

par exemple souhaité Sortie

<ex:root> 
    <ex:something attr:name="value"> 
</ex:root> 

Mais ce que je reçois est

<root> 
    <something name="value"> 
</root> 
actuellement

Ceci est quelque peu simplifiée puisque tous les espaces de noms que je utilise sont entièrement définies en utilisant les attributs xmlns sur la élément de document, mais j'ai omis cela pour plus de clarté ici. Je suis conscient que la classe XmlWriter peut être utilisée pour enregistrer un XmlDocument et que cela prend une classe XmlWriterSettings mais je ne pouvais pas voir comment configurer ceci de sorte que j'obtienne une sortie QNames complète.

Répondre

1

Comme vous le dites, l'élément racine nécessite la définition d'espace de noms:

<?xml version="1.0"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension"> 
    <iis:WebSite Id="asdf" /> 
</Wix> 

Le code pour le xml ci-dessus:

XmlDocument document = new XmlDocument(); 
document.AppendChild(document.CreateXmlDeclaration("1.0", null, null)); 
XmlNode rootNode = document.CreateElement("Wix", "http://schemas.microsoft.com/wix/2006/wi"); 
XmlAttribute attr = document.CreateAttribute("xmlns:iis", "http://www.w3.org/2000/xmlns/"); 
attr.Value = "http://schemas.microsoft.com/wix/IIsExtension"; 
rootNode.Attributes.Append(attr); 
rootNode.AppendChild(document.CreateElement("iis:WebSite", "http://schemas.microsoft.com/wix/IIsExtension")); 
document.AppendChild(rootNode); 

L'obligation de passer l'espace de noms uri comme argument à la CreateAttribute et les méthodes CreateElement semblent contre-intuitives parce qu'on pourrait soutenir que le document est capable de dériver cette information, mais bon, c'est comme ça que ça fonctionne.

+0

ouais cela semble stupide, merci pour la réponse – RobV

+0

Juste essayé cela et maintenant je reçois des définitions d'espace de noms sur tous mes éléments quand ils ont seulement besoin de déclarer une fois dans l'élément racine, pourquoi est-ce? – RobV

+0

Je ne suis pas sûr, mais je vais jeter un oeil si vous postez le code que vous utilisez pour générer l'exemple xml. – grenade