Frage

Ich arbeite in Microsoft Visual C# 2008 Express.

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

Ich sage mir, dass ich mit dem Wort "fantastisch" etwas tun möchte - möglicherweise nennen Sie eine Funktion, die etwas namens "folellieren" macht.

Was ist der beste Weg in C#, um festzustellen, dass dieses Tag existiert und dieses Attribut erhalten? Ich habe gearbeitet ein wenig mit Xelements und so in C#, aber hauptsächlich mit dem Lesen von XML -Dateien zu tun.

Vielen Dank!

-Adeena

War es hilfreich?

Lösung

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 an dabbblernl berücksichtigt, wo Sie mehrere Attribute für mehrere Elemente analysieren möchten.

Andere Tipps

Sie können die XML mit einem regulären Ausdruck extrahieren, die extrahierte XML -Zeichenfolge in einem Xelement laden und von dort aus gehen:

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 macht eine Ausnahme, wenn kein Mytag -Element gefunden wurde, aber das kann durch Einfügen einer Reihe von Folgendes behoben werden:

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

Es wird noch interessanter, wenn die Zeichenfolge mehr als nur das Mytag -Tag halten könnte ...

Ich bin ein wenig verwirrt über Ihr Beispiel, da Sie zwischen String (Textinhalt), Tags und Attributen wechseln. Aber ich denke, was Sie wollen, ist XPath.

Also, wenn Ihr XML -Stream so aussieht:

u003Cadeena/>u003Cparent>u003Cchild x="this is my awesome string">Dies ist eine weitere großartige Zeichenfolgeu003Cchild/>u003Cadeena/>

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

// Child/@x

und eine solche, um den Textwert unter dem Kindertag zu finden:

//Kind

Ich bin ein Java -Entwickler, daher weiß ich nicht, mit welchen XML -Bibliotheken Sie dies tun würden. Sie benötigen jedoch einen DOM -Parser, um eine W3C -Dokumentenklasseninstanz für Sie zu erstellen, indem Sie in der XML -Datei lesen und dann XPath verwenden, um die Werte herauszuholen.

Es gibt eine gute XPath Tutorial von den W3C -Schulen wenn du es brauchst.

AKTUALISIEREN:

Wenn Sie sagen, dass Sie bereits einen XML -Stream als Zeichenfolge haben, dann ist die Antwort, ihn nicht aus einer Datei, sondern aus der Zeichenfolge selbst zu lesen. Java hat Abstraktionen, die als InputStream und Leser bezeichnet werden und Leser mit Streams von Bytes bzw. Zeichen verarbeiten. Die Quelle kann eine Datei, eine Zeichenfolge usw. sein. Überprüfen Sie Ihre C# DOM -API, um festzustellen, ob sie etwas Ähnliches hat. Sie übergeben die Zeichenfolge an einen Parser, der ein DOM -Objekt zurückgibt, das Sie manipulieren können.

Da die Eingabe nicht gut geformt ist, können Sie sie nicht mit einem der integrierten XML-Bibliotheken analysieren. Sie würden einen regelmäßigen Ausdruck benötigen, um das gut geformte Stück zu extrahieren. Sie könnten wahrscheinlich einen der verzeihenderen HTML -Parser wie ein verwenden HtmlagilityPack auf Codeplex.

Das XmlTextReader kann XML -Fragmente mit einem speziellen Konstruktor analysieren, der kann Hilfe in dieser Situation, aber das bin ich nicht positiv.

Hier gibt es einen ausführlichen Artikel:

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

Dies ist meine Lösung, die mit Regex mit jeder XML -Art übereinstimmt:C# Bessere Möglichkeit, XML zu erkennen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top