Domanda

Sto lavorando in Microsoft Visual C# 2008 Express.

Diciamo che ho una stringa e il contenuto della stringa è: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Io sto dicendo a me stesso che voglio fare qualcosa per la parola "fantastico" - possibilmente chiamare una funzione che fa una cosa chiamata "colora".

Qual è il modo migliore in C# per andare su di rilevare che questo tag esiste e ottenere che il attributo?Ho lavorato un po ' di con XElements e tali in C#, ma soprattutto a che fare con la lettura di in e out file XML.

Grazie!

-Adeena

È stato utile?

Soluzione

Un'altra soluzione:

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
}

Ho anche preso in considerazione il tuo commento e Dabblernl in cui si desidera analizzare più attributi su più elementi.

Altri suggerimenti

È possibile estrarre il XML con un'espressione regolare, caricare la stringa XML estratto in un XElement e passare da 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

Questo codice un'eccezione se è stato trovato nessun elemento MyTag, ma che può essere eliminato con l'inserimento di una linea di:

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

E diventa ancora più interessante se la stringa poteva contenere più di un semplice tag MyTag ...

Io sono un po ' confuso circa il vostro esempio, perché si passa tra la stringa (testo contenuto), tag e attributi.Ma penso che ciò che si desidera è di XPath.

Quindi, se il vostro flusso XML simile a questo:

<adeena /><parent><child x="this is my awesome string">Questo è un altro impressionante stringa<child /><adeena />

Devi usare un'espressione XPath che assomiglia a questo per trovare l'attributo:

//bambino/@x

e uno come questo per trovare il valore di testo sotto il bambino di tag:

//bambino

Io sono un programmatore Java, quindi non so che cosa le librerie XML che si potrebbe utilizzare per fare questo.Ma avrete bisogno di un parser DOM per creare un Documento di W3C istanza di classe per voi, leggendo nel file XML e quindi utilizzo di XPath per cogliere i valori.

C'è una buona XPath tutorial dal W3C scuole se ne avete bisogno.

AGGIORNAMENTO:

Se stai dicendo che hai già un flusso XML come Stringa, quindi la risposta è di non leggere da un file, ma la Stringa stessa.Java ha astrazioni chiamato InputStream e Lettore di gestire i flussi di byte e caratteri, rispettivamente.La sorgente può essere un file, una stringa, etc.Controllare il C# DOM API per vedere se ha qualcosa di simile.Potrete passare la stringa di un parser che darà un oggetto DOM che è possibile modificare.

Dal momento che l'ingresso non è ben formato XML non sarà in grado di analizzare con qualsiasi del costruito in librerie XML. Avreste bisogno di un'espressione regolare per estrarre il pezzo ben formato. Probabilmente si potrebbe utilizzare uno dei parser HTML più indulgente come HtmlAgilityPack su CodePlex.

Il XmlTextReader può analizzare frammenti XML con un costruttore speciale che possono di aiuto in questa situazione, ma io non sono positive di questo.

C'è un articolo approfondito qui:

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

Questa è la mia soluzione per adattarsi a qualsiasi tipo di XML utilizzando Regex: C # Modo migliore per rilevare XML?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top