2010-01-27 5 views
2

Tout d'abord, voici mon code.Création XML avec C#

IEnumerable<XElement> targetDirectory = 
    from XElement e in workingXmlDocument.Descendants(wixNS + "Directory") 
    where e.Attribute("Id").Value == "TARGETDIR" 
    select e; 
foreach (var now in targetDirectory) 
{ 
    now.Add(XElement.Parse("<Directory Id='" + fileVariable.Directory.Name 
              + @"' />")); 
} 

Voici ce que j'essaie de faire. J'essaye de rechercher chaque élément d'annuaire avec l'attribut Id évalué à TARGETDIR. Ensuite, je place un nouvel élément de répertoire à l'intérieur de celui-ci avec le nom du répertoire d'un fichier. C'est juste cela. Le problème est qu'il place simplement tous les répertoires dans une seule ligne (pas de saut de ligne, pas de retrait, rien, seulement les données brutes), et il inclut une balise xmlns vide avec chaque élément. Comment puis-je lui dire que chaque élément doit avoir sa propre ligne dans le document XML et comment puis-je lui dire d'utiliser le même espace de noms que le reste du document? Je sais que je pourrais juste dire explicitement qu'il devrait avoir un attribut xmlns avec la bonne NS, mais c'est la dernière chose que je veux faire. des idées?

Mise à jour - le code du XML Writer

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 
settings.NewLineHandling = NewLineHandling.Entitize; 

using (XmlWriter currentWriter = XmlWriter.Create(filePath, settings)) 
{ 
    workingXmlDocument.WriteTo(currentWriter); 
    currentWriter.Flush(); 
} // using (XmlWriter xw = XmlWriter.Create(FilePath)) 

De là, il n'ajoute de nouvelles lignes aux éléments inclus à partir du code ci-dessus.

+0

(J'ai reformaté pour préciser que la boucle foreach ne fait pas partie de la requête.) –

+0

@Jon Skeet - merci pour cela – Adkins

+0

Pourquoi est-ce la dernière chose que vous voulez faire? C'est un peu comme le XML fonctionne. –

Répondre

2

Je voudrais écrire la boucle comme suit, en fournissant l'espace de noms. Cela devrait créer les nœuds comme vous le souhaitez.

foreach (var now in targetDirectory) 
{ 
    now.Add(new XElement(
     wixNS + "Directory", 
     new XAttribute("Id", fileVariable.Directory.Name)); 
} 

Je suppose ici que wixNS est une instance de XNamespace, tels que:

XNamespace wixNS = "http://schemas.microsoft.com/wix/2003/01/wi"; 

Je ne sais pas pourquoi le indenter ne fonctionne pas.

+0

Merci. Cela a corrigé le problème d'espace de noms. Mais comment puis-je améliorer le formatage de la sortie. Tous les éléments créés dans cette boucle sont juste placés sur une ligne – Adkins

+0

vous présomption est correcte. – Adkins

+0

@Update - Je l'ai déjà inclus avec mon écrivain. Je vais ajouter le code pour mon auteur à la publication originale. – Adkins