Question

Je travaille sous Microsoft Visual C# 2008 Express.

Disons que j'ai une chaîne et que le contenu de la chaîne est : "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Je me dis que je veux faire quelque chose avec le mot "génial" - éventuellement appeler une fonction qui fait quelque chose appelé "coloriser".

Quelle est la meilleure façon en C# de détecter que cette balise existe et d'obtenir cet attribut ?J'ai travaillé un peu avec XElements et autres en C#, mais surtout avec la lecture et la sortie de fichiers XML.

Merci!

-Adéena

Était-ce utile?

La solution

Une autre solution:

var myString = "This is my <myTag myTagAttrib='colorize'>awesome</myTag> string.";
try
{
    var document = XDocument.Parse("<root>" + myString + "</root>");
    var matches = ((System.Collections.IEnumerable)document.XPathEvaluate("myTag|myTag2")).Cast<XElement>();
    foreach (var element in matches)
    {
        switch (element.Name.ToString())
        {
            case "myTag":
                //do something with myTag like lookup attribute values and call other methods
                break;
            case "myTag2":
                //do something else with myTag2
                break;
        }
    }
}
catch (Exception e)
{
    //string was not not well formed xml
}

J'ai aussi pris en compte votre commentaire à Dabblernl où vous souhaitez analyser plusieurs attributs sur plusieurs éléments.

Autres conseils

Vous pouvez extraire le XML avec une expression régulière, chargez la chaîne xml extraite dans un XElement et aller de là:

string text=@"This is my<myTag myTagAttrib='colorize'>awesome</myTag> text.";
Match match=Regex.Match(text,@"(<MyTag.*</MyTag>)");
string xml=match.Captures[0].Value;
XElement element=XElement.Parse(xml);
XAttribute attribute=element.Attribute("myTagAttrib");
if(attribute.Value=="colorize") DoSomethingWith(element.Value);// Value=awesome

Ce code lancera une exception si aucun élément MyTag a été trouvé, mais peut être corrigée en insérant une ligne de:

if(match.Captures.Count!=0)
{...}

Il est encore plus intéressant si la chaîne pourrait contenir plus que le Tag MyTag ...

Je suis un peu confus au sujet de votre exemple, car vous basculez entre la chaîne (contenu textuel), les balises et les attributs.Mais je pense que ce que vous voulez, c'est XPath.

Donc si votre flux XML ressemble à ceci :

<adeena/><parent><child x="c'est ma super chaîne">C'est une autre chaîne géniale<child/><adeena/>

Vous utiliseriez une expression XPath qui ressemble à ceci pour trouver l'attribut :

//enfant/@x

et un comme ceci pour trouver la valeur du texte sous la balise enfant :

//enfant

Je suis un développeur Java, donc je ne sais pas quelles bibliothèques XML vous utiliseriez pour ce faire.Mais vous aurez besoin d'un analyseur DOM pour créer une instance de classe de document W3C pour vous en lisant le fichier XML, puis en utilisant XPath pour extraire les valeurs.

Il y a un bon Tutoriel XPath des écoles du W3C si tu en as besoin.

MISE À JOUR:

Si vous dites que vous disposez déjà d'un flux XML sous forme de chaîne, la réponse n'est pas de le lire à partir d'un fichier mais à partir de la chaîne elle-même.Java possède des abstractions appelées InputStream et Reader qui gèrent respectivement les flux d'octets et de caractères.La source peut être un fichier, une chaîne, etc.Vérifiez votre API C# DOM pour voir si elle a quelque chose de similaire.Vous transmettrez la chaîne à un analyseur qui renverra un objet DOM que vous pourrez manipuler.

Depuis l'entrée n'est pas XML bien formé vous ne serez pas en mesure d'analyser avec l'un des construit dans les bibliothèques XML. Vous auriez besoin d'une expression régulière pour extraire la pièce bien formé. Vous pouvez probablement utiliser une des parseurs plus indulgents HTML comme HtmlAgilityPack sur CodePlex.

Le XmlTextReader peut analyser des fragments XML avec un constructeur spécial peut aide dans cette situation, mais je ne suis pas positif à ce sujet.

Il y a un article en profondeur ici:

http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx

Ceci est ma solution pour correspondre à tout type de XML à l'aide Regex: C # Une meilleure façon de détecter XML?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top