2016-02-15 1 views
0

Je cherche un moyen de supprimer les espaces de début et de fin de la valeur d'un noeud XML. Compte tenu de l'exemple de base suivante:Supprimer les espaces de début et de fin de la valeur du noeud XML

<CAR> 
    <MAKE> Ford </MAKE> 
    <COLOR> Yellow </COLOR> 
    <!--<YEAR> 1987 </YEAR>--> 
</CAR> 

J'ai besoin pour obtenir la sortie suivante:

<CAR> 
<MAKE>Ford</MAKE> 
    <COLOR>Yellow</COLOR> 
    <!--<YEAR> 1987 </YEAR>--> 
</CAR> 

j'ai réussi à obtenir tout cela fait en appliquant successivement les deux regex suivantes:

>\s*[^a-zA-Z0-9^<]* 

[^a-zA-Z0-9^>]*\s*</ 

Comme mes connaissances concernant regex sont très limitées, c'est tout ce que j'ai pu trouver. Le problème est que j'ai fini avec un document XML cassé chaque fois que le fichier contenait des commentaires.

Alors, quelqu'un peut-il m'aider à obtenir une expression qui supprime avec succès les espaces de début et de fin des valeurs tout en laissant les commentaires intacts?

J'espère, je me suis fait clair. Merci d'avance!

+0

Avez-vous essayé [\ S] (capital s) – csharpcoder

+0

Il ya un site cool pour essayer votre regex: http://regexr.com/ Essayez-le. Cela pourrait aider: D –

+1

Je suggérerais une autre approche au problème. Vous pouvez essayer XSLT pour supprimer les espaces. http://stackoverflow.com/questions/16933351/xslt-transformation-to-remove-space-within-element – sashwat

Répondre

0

Je ne vois pas la nécessité d'expressions régulières ici, en outre, vous aurez besoin dans tous les cas de boucler sur vos nœuds xml, alors pourquoi ne pas simplement boucler sur vos valeurs de nœud et faire .Trim() dessus?

Par exemple:

var xml = XDocument.Load("D:/myXml.xml"); 

    foreach (var node in xml.Root.Elements()) 
    { 
     foreach (var child in node.Elements()) 
     { 
      Console.WriteLine(string.Format("[{0}]", child.Value.Trim())); 
     } 
    } 

Mon exemple de fichier xml:

enter image description here

La sortie: (J'entouré avec [], vous pouvez donc voir les espaces blancs sont partis)

enter image description here

+0

Merci. Je devais avoir mes oeillères. Je suis allé avec une solution similaire à la vôtre. Parfois, tout ce dont il a besoin est d'une paire supplémentaire d'yeux pour lancer la balle. – Zettel

0

Essayez thi s

Regex.Replace(input string, @"(([^\s]+)\s+)", "$2");

0

Si vous ne me dérange pas de ne pas utiliser Regex alors cela fonctionne:

var doc = XDocument.Parse(@"<CAR> 
    <MAKE> Ford </MAKE> 
    <COLOR> Yellow </COLOR> 
    <!--<YEAR> 1987 </YEAR>--> 
</CAR>"); 

foreach (var xe in doc.DescendantNodes() 
    .Where(n => n.NodeType == XmlNodeType.Text) 
    .Select(x => x.Parent) 
    .ToArray()) 
{ 
    xe.Value = xe.Value.Trim(); 
} 

Il met à jour la doc et me donne ceci:

<CAR> 
    <MAKE>Ford</MAKE> 
    <COLOR>Yellow</COLOR> 
    <!--<YEAR> 1987 </YEAR>--> 
</CAR> 
+0

Salut, je vais garder cela à l'esprit au cas où je me retrouverai dans une situation similaire. Si j'avais assez de réputation, je vous donnerais +1. – Zettel