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 :

Manipulation sur des string : fichier XML


Sujet :

C#

  1. #1
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut Manipulation sur des string : fichier XML
    Bonjour / Bonsoir,

    Je travaille actuellement sur un application utilisant un fichier Xml comme template.
    Lors de la lecture du template, afin de pouvoir procéder à la réécriture avec les bonnes données, je dois remplacer certaines parties de ma chaine de caractères.

    Voici un exemple de chaines sur lesquelles je dois réaliser des modifications :
    <Title>is_BenefitType</Title>

    <Value>is_Position</Value>, <Value>is_Department</Value>, <Value>is_Company</Value>
    Prenons le premier exemple. La chaine doit être modifiée de sorte à pouvoir récupérer le texte entre les balises <Title>, ainsi, je récupère la valeur correspondante via mon objet et l'insère à la place de "is_BenefitType" en supprimant les balises.
    "<Title>is_BenefitType</Title>" devient donc "Hospitality".

    Même chose en plus compliqué pour le deuxième exemple, sauf que je dois conserver ce qui est en dehors des balises.
    Par exemple, "<Value>is_Position</Value>, blabla, <Value>is_Department</Value>, <Value>is_Company</Value>" devient "IT Consultant, blabla, IT, CB".

    Jusque là, je récupère le texte sous forme de chaine en arrivant à cette étape, mais à la base j'utilise un XmlReader, je peux donc utiliser mon Reader pour continuer le traitement.
    Je suis preneur de toute solution viable. En attendant je vais laisser mon cerveau reposer ce soir, je reprendrai mes tentatives demain matin.

    Merci par avance pour toute aide apportée.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 80
    Points : 163
    Points
    163
    Par défaut
    La documentation Microsoft n'est pas suffisante pour ton cas?

    http://msdn.microsoft.com/fr-fr/libr...(v=vs.95).aspx

  3. #3
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    Pour le premier exemple, j'arrive à m'en débrouiller, pour le second c'est plus tricky, je galère. Si la doc me suffisait, je ne posterais pas sur le forum.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 739
    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 739
    Points : 5 425
    Points
    5 425
    Par défaut
    Bonjour,

    Tu n'arrivera pas à parser ton XML à l'aide d'un XmlReader ou de quoi que soit prévu pour manipuler du XML pour la simple raison que le format que tu décrit n'est pas du XML.
    Un fichier XML ne comporte pas de virgule entre les nœuds et encore moins un texte libre !

    Tu pourrais par contre définir un nœud pour indiquer qu'une partie du contenu ne doit pas être changé.
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Title>is_BenefitType</Title>
    <Value>is_Position</Value>
    <NoChange>,</NoChange>
    <NoChange>blabla,</NoChange>
    <Value>is_Department</Value>
    <NoChange>,</NoChange>
    <Value>is_Company</Value>

  5. #5
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    La partie que je souhaite parser n'est en effet plus du XML, c'est là que ça devient donc compliqué. Le reste en est pourtant :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <Root>
    	<ReportTitle>Gift and Hospitality</ReportTitle>
    	<Paragraph>
    		<Header>Summary</Header>
    		<Text></Text>
    	</Paragraph>
    	<Table>
    		<Row>
    			<Column><Title>is_Reference</Title></Column>
    			<Column><Value>is_Reference</Value></Column>
    		</Row>
    		<Row>
    			<Column><Title>is_Position</Title></Column>
    			<Column><Value>is_Position</Value>, <Value>is_Department</Value>, <Value>is_Company</Value></Column>
    		</Row>
    	</Table>
    </Root>
    Un fois arrivé dans le node Column, je dois pouvoir détecter son contenu pour savoir si j'ai à faire à un Title ou une Value . Je dois ensuite parser pour remplacer les parties par des valeurs.

    Je ne peux me permettre de changer le template.
    Comment parser simplement ces chaines?

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu pourrais utiliser les expressions régulières pour trouver tes balises et remplacer le texte.

  7. #7
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par PatteDePoule Voir le message
    Tu pourrais utiliser les expressions régulières pour trouver tes balises et remplacer le texte.
    C'est exactement ce sur quoi je viens de partir, mais je rencontre quelques obstacles :

    Cette Regex match la ligne entière car elle prend la dernière occurence de </Value>. Je cherche encore comment contrer ça pour avoir toutes mes sous chaines.

    Edit : Résolu :
    Je continu sur cette lancée, je vous tiens au courant de la tournure des choses

  8. #8
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    Je suis parvenu à réaliser ce que je voulais avec la classe Regex, et un peu d'aide sur le chat !

    J'ai donc créé une Regex pour chacune de mes balises (Title et Value).
    J'ai ensuite réalisé la détection de la présence de l'un ou l'autre dans ma chaine, appelant une fonction en conséquence qui récupère ma valeur, cherche la chaine de remplacement dans mon objet, puis réalise le remplacement.

    Je peux éventuellement partager mon code, ce qui pourra peut être aider des personnes dans le futur non ?

    En attendant, je marque mon sujet comme résolu !

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 894
    Points : 6 648
    Points
    6 648
    Par défaut
    Tu peux très bien le faire en utilisant XmlDocument et des requêtes XPath pour cibler les bons nœuds directement:
    Code csharp : 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
    string XmlData = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <Root>
    	<ReportTitle>Gift and Hospitality</ReportTitle>
    	<Paragraph>
    		<Header>Summary</Header>
    		<Text></Text>
    	</Paragraph>
    	<Table>
    		<Row>
    			<Column><Title>is_Reference</Title></Column>
    			<Column><Value>is_Reference</Value></Column>
    		</Row>
    		<Row>
    			<Column><Title>is_BenefitType</Title></Column>
    			<Column><Value>is_Position</Value>, <Value>is_Department</Value>, <Value>is_Company</Value></Column>
    		</Row>
    	</Table>
    </Root>";
     
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(XmlData);
     
    XmlNode titleNode = xmlDoc.SelectSingleNode("/Root/Table/Row/Column/Title[.='is_BenefitType']");
    if(titleNode != null)
        titleNode.ParentNode.ReplaceChild(xmlDoc.CreateTextNode("Hospitality"), titleNode);
     
    Console.WriteLine(xmlDoc.OuterXml);

  10. #10
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    Vrai, XmlDocument est certainement plus simple à utiliser, mais très lourd et lent comparé à XmlReader.
    Mes fichiers peuvent monter à plusieurs milliers voir plusieurs dizaines de milliers de lignes.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/09/2009, 09h35
  2. Réponses: 2
    Dernier message: 18/09/2008, 14h25
  3. agir sur des string
    Par 20100. dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/02/2008, 14h49
  4. Travail sur des Strings
    Par Pingvince dans le forum Général Python
    Réponses: 16
    Dernier message: 25/12/2007, 04h22
  5. Optimisation mémoire sur des String
    Par CyberChouan dans le forum Langage
    Réponses: 6
    Dernier message: 25/02/2007, 20h25

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