2 Stimmen

Wie arbeite ich mit einem XML-Tag innerhalb einer Zeichenkette?

Ich arbeite mit Microsoft Visual C# 2008 Express.

Nehmen wir an, ich habe eine Zeichenkette und der Inhalt der Zeichenkette ist: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Ich sage mir, dass ich etwas mit dem Wort "awesome" machen will - möglicherweise eine Funktion aufrufen, die etwas namens "colorize" macht.

Was ist der beste Weg in C# zu gehen, um zu erkennen, dass dieses Tag vorhanden ist und erhalten das Attribut? Ich habe gearbeitet ein wenig mit XElements und so in C#, sondern vor allem zu tun mit dem Lesen in und aus XML-Dateien.

Gracias.

-Adeena

2voto

Martijn Laarman Punkte 13386

Eine andere Lösung:

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
}

Ich habe auch Ihren Kommentar zu Dabblernl berücksichtigt, in dem Sie mehrere Attribute für mehrere Elemente analysieren wollen.

0 Stimmen

Das kommt dem, was ich machen will, schon näher. Aber anstatt mit einem "XDocument" zu arbeiten, kann ich dies mit einem XElement tun? Grundsätzlich kann ich meine Zeichenkette als XElement mit dem folgenden festlegen: "XElement element = XElement.Parse( @myXMLstring);", wobei ich <Root></Root> im String habe. Als nächstes kann ich testen, ob es hat Kind-Elemente mit element.HasElements. Wenn es Kind-Elemente hat, wie gebe ich sie zurück? alle Kinder sind optional... muss ich einen Test durchführen, um zu sehen, ob jedes einzelne vorhanden ist?

0 Stimmen

Natürlich habe ich das Beispiel nach bestem Wissen und Gewissen aktualisiert, um zu verstehen, was Sie tun wollen. Es wählt im Grunde die Elemente, die Sie angeben (getrennt durch ein |) in Übereinstimmungen. Dann wird eine Schleife über die gefundenen Elemente (falls vorhanden) gezogen und sie werden unterschiedlich verarbeitet. Sie müssen nicht testen, ob jedes Element vorhanden ist, aber wenn sie nicht da sind, werden sie einfach nicht in Übereinstimmungen ausgewählt.

0 Stimmen

Cool. Dies sieht genau wie das, was ich tun möchte. Ein Problem mit "IEnumerable"... Ich erhalte die folgende Fehlermeldung: "Usnig der generische Typ 'System.Collections.Generic.IEnumerable<T> erfordert '1' Typargumente" ??

1voto

Dabblernl Punkte 15365

Sie können das XML mit einem regulären Ausdruck extrahieren, den extrahierten XML-String in ein XElement laden und von dort aus weiterarbeiten:

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

Dieser Code löst eine Ausnahme aus, wenn kein MyTag-Element gefunden wurde, aber das kann durch das Einfügen einer Zeile von behoben werden:

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

Noch interessanter wird es, wenn die Zeichenfolge mehr als nur den MyTag-Tag enthalten könnte...

0 Stimmen

Ich habe geschummelt, ich habe den "This is my" Teil deines Strings entfernt, um das XML gut zu gestalten. Ich hoffe, dass es Ihnen trotzdem hilft

0 Stimmen

Nun, ich könnte meine Zeichenfolge in ein temporäres Tag wie dieses einfügen, richtig? "<tempTag>Das ist mein <myTag myTagAttrib="colorize">awesome</myTag> string.</tempTag>", dann habe ich wohlgeformtes XML und ich denke, ich kann von dort aus loslegen...

0 Stimmen

Und damit zusammenhängend... woher weiß ich (weil ich es nicht weiß, wenn ich meine Zeichenfolge und mein Element einrichte), ob das Tag "myTag" überhaupt im Element existiert? Vielleicht ist es nicht vorhanden, oder es könnte "myTag2" sein. (Ich habe mehrere mögliche Tags auf dieser Ebene

0voto

duffymo Punkte 298898

Ihr Beispiel verwirrt mich ein wenig, da Sie zwischen der Zeichenfolge (Textinhalt), den Tags und den Attributen wechseln. Aber ich denke, was Sie wollen, ist XPath.

Wenn Ihr XML-Stream also wie folgt aussieht:

<adeena/><parent><child x="das ist mein toller String">Dies ist ein weiterer toller String<child/><adeena/>

Sie würden einen XPath-Ausdruck verwenden, der wie folgt aussieht, um das Attribut zu finden:

//kind/@x

und eine wie diese, um den Textwert unter dem Child-Tag zu finden:

//kind

Da ich Java-Entwickler bin, weiß ich nicht, welche XML-Bibliotheken Sie dafür verwenden würden. Aber Sie benötigen einen DOM-Parser, der eine W3C-Dokumenten-Klasseninstanz für Sie erstellt, indem er die XML-Datei einliest und dann mit XPath die Werte ausliest.

Es gibt eine gute XPath-Tutorial von den W3C-Schulen wenn Sie es brauchen.

UPDATE:

Wenn Sie sagen, dass Sie bereits einen XML-Stream als String haben, dann ist die Antwort, ihn nicht aus einer Datei zu lesen, sondern aus dem String selbst. Java verfügt über Abstraktionen namens InputStream und Reader, die Byte- bzw. Zeichenkettenströme verarbeiten. Die Quelle kann eine Datei, ein String usw. sein. Prüfen Sie, ob Ihre C#-DOM-API etwas Ähnliches bietet. Sie übergeben die Zeichenfolge an einen Parser, der ein DOM-Objekt zurückgibt, das Sie bearbeiten können.

0 Stimmen

In meinem C#-Code ist dies: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string." ist wirklich, wirklich als String gespeichert... das ist mein Problem. wie verwandle ich es in ein XElement oder Xpath oder...?

0 Stimmen

Mein XML-Beispiel ist nicht wohlgeformt; das tut mir leid. Ich habe es unter Verwendung von escapeten Werten in SO eingegeben und dabei keine besonders gute Arbeit geleistet.

0voto

Josh Punkte 66190

Da es sich bei der Eingabe nicht um wohlgeformtes XML handelt, können Sie es mit keiner der eingebauten XML-Bibliotheken parsen. Sie benötigen einen regulären Ausdruck, um den wohlgeformten Teil zu extrahieren. Sie könnten wahrscheinlich einen der HTML-Parser verwenden, die mehr verzeihen, wie HtmlAgilityPack auf CodePlex.

0 Stimmen

Das Beispiel im Kommentar sieht für mich wohlgeformt aus. Was habe ich übersehen?

0 Stimmen

Ooops, das ist meine, die nicht stimmt. Ich habe mich nicht genau genug kontrolliert.

0voto

Hans Van Slooten Punkte 2249

El XmlTextReader kann XML-Fragmente mit einem speziellen Konstruktor parsen, der Mai in dieser Situation helfen, aber ich bin mir da nicht sicher.

Ein ausführlicher Artikel ist hier zu finden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X