IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de SmartTag


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut Problème de SmartTag
    Bonjour,

    Il y a quelques mois, j'ai ouvert un post et je pensais l'avoir résolu (certes de manière peu orthodoxe mais résolu quand même).
    Il s'agit du post suivant :
    https://www.developpez.net/forums/d1...er-smart-tags/

    Pour résumer il s'agissait d'enlever les smartTag d'un document word tout en gardant son contenu.
    Le cas que je cherchais à résoudre était toujours le même mais je le rencontrais plusieurs fois dans le document
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="metricconverter">
        <w:smartTagPr>
          <w:attr w:name="ProductID" w:val="1 A" />
        </w:smartTagPr>
        <w:r>
          <w:t>1 A</w:t>
        </w:r>
      </w:smartTag>


    Je pensais l'avoir résolu avec le code suivant (sourceBody est de type DocumentFormat.OpenXml.Wordprocessing.Body) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     sourceBody.InnerXml = Regex.Replace(
                    sourceBody.InnerXml,
                    @"(<\w*:smartTag .*>\n? *<\S*:smartTagPr>.*<\/\S*:smartTagPr>\n?|<\/\w:smartTag>\n?)",
                    String.Empty, RegexOptions.Singleline);
    Mais on viens de m'apporter un document dans lequel ma rustine inélégante pose plus soucis que le problème initial.
    Dans ce document je rencontre mon cas initial mais également et plusieurs fois un autre cas :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="PersonName" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:smartTagPr>
        <w:attr w:name="ProductID" w:val="LA REPARTITION ACTUELLE." />
      </w:smartTagPr>
      <w:r>
        <w:rPr>
          <w:b />
          <w:bCs />
        </w:rPr>
        <w:t>LA REPARTITION ACTUELLE.</w:t>
      </w:r>
    </w:smartTag>

    Le texte change à chaque fois dans le smartTag mais semble toujours commencer par "LA REPARTITION" (sans doute une coïncidence mais le précise au cas où).

    Mon code actuel à pour effet de m'enlever tout le contenu entre le premier smartTag "LA REPARTITION" et le premier smartTag "1 A" et du coup je perd une grosse partie du document.

    J'ai besoin de vos conseils pour passer de ceci
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="PersonName" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:smartTagPr>
        <w:attr w:name="ProductID" w:val="LA REPARTITION ACTUELLE." />
      </w:smartTagPr>
      <w:r>
        <w:rPr>
          <w:b />
          <w:bCs />
        </w:rPr>
        <w:t>LA REPARTITION ACTUELLE.</w:t>
      </w:r>
    </w:smartTag>

    a ceci (et ce, quelque soit le contenu du smartTag)

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      <w:r>
        <w:rPr>
          <w:b />
          <w:bCs />
        </w:rPr>
        <w:t>LA REPARTITION ACTUELLE.</w:t>
      </w:r>

    Edit :
    Je pense que ceci ferait également l'affaire si c'est plus facile
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!--<w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="PersonName" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">-->
      <!--<w:smartTagPr>
        <w:attr w:name="ProductID" w:val="LA REPARTITION ACTUELLE." />
      </w:smartTagPr>-->
      <w:r>
        <w:rPr>
          <w:b />
          <w:bCs />
        </w:rPr>
        <w:t>LA REPARTITION ACTUELLE.</w:t>
      </w:r>
    <!--</w:smartTag>-->

    Merci.

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    En regardant un peu, je pense que le problème est un problème de regex glouton vs non glouton.

    En effet, un élément comme ".*" peut se comporter de manière très différentes :
    • soit on essai de matcher l'élément ayant la plus grande taille ;
    • soit on essai de matcher l'élément ayant la plus petite taille.


    Par défaut, c'est glouton (gready en anglais) et donc quand tu as plusieurs SmartTag, ça peut te prendre la balise d'ouverture du premier tag, et la balise de fermeture du dernier tag, faisant en sorte que tout ce qu'il y a entre est inclus dans ta sélection, même si ce n'est pas dans un SmartTag. Et il semblerait que ce soit le comportement que tu observes.

    Pour rendre la recherche non gloutone, il suffit de suffixer un "*" par un "?". Par exemple ".*?".

    Après, il est généralement déconseillé de faire des regex pour gérer du XML (car c'est souvent, très souvent le bazar), et il vaut mieux passer par un parseur XML.

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Entendu qu'après de nombreuse combinaisons infructueuses d'ajouts de point d'interrogation derrière les différentes étoiles;
    Entendu que les décidément les expressions régulières, c'est vraiment pas mon truc;

    Par ces motifs, j'ai finalement suivi ton très judicieux conseil, mis un petit pouce vers le haut sur ton message et opté pour une utilisation du parseur XML.

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    XElement root = XElement.Parse(sourceBody.OuterXml);
    XNamespace nms = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
    IEnumerable<XElement> smartTags = root.Descendants(nms + "smartTag");
    IEnumerable<XElement> smartTagProperties = root.Descendants(nms + "smartTagPr");
     
    foreach (XElement smartTag in smartTags.ToArray())
    {
        smartTag.AddBeforeSelf(smartTag.Elements());
        smartTag.Remove();
    }
     
    foreach (XElement smartTagProperty in smartTagProperties.ToArray())
    {
        smartTagProperty.Remove();
    }
     
    //0.368 seconds
    //sourceBody.InnerXml = String.Join("", root.Nodes().Select(it => it.ToString()).ToArray());
     
    // 0.372 seconds 
    //sourceBody.InnerXml = String.Concat(root.Nodes().Select(it => it.ToString()).ToArray()); 
     
    // 0.335 seconds
    StringBuilder builder = new StringBuilder();
    foreach (XNode node in root.Nodes())
    {
        builder.Append(node.ToString(SaveOptions.DisableFormatting));
    }
     
    sourceBody.InnerXml = builder.ToString();

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Le code n'est pas bien compliqué non plus, et sans doute plus facile à lire et à maintenir que l'utilisation d'une expression régulière !

    Sinon, juste pour info, je viens de faire un essai avec ce regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <\w*:smartTag .*?>\n? *<\S*:smartTagPr>.*?<\/\S*:smartTagPr>\n?|<\/\w:smartTag>\n?
    semble fonctionner chez moi (si j'ai bien compris l'objectif ).

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Il me semble avoir essayé cette configuration sauf que j'ai gardé les parenthèses au début et à la fin.
    ça m'enlevait des partie de documents avant même de trouver le premier Smart Tag.

    Mais bon c'est effectivement plus facile à comprendre sans regex, je suis tout à fait d'accord.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo