XML-Datei durchsuchen mit Attributen

ReesClarkD

Grünschnabel
Hallo!

Ich habe folgendes Problem: Ich möchte eine XML Datei durchsuchen können, in der die Handlung von Filmen mit deren Titel als Attribut abgespeichert ist.

Hier meine XML Datei (wächst noch, muss erstmal generell an den Start kommen...):
Code:
<?xml version="1.0" encoding="utf-8"?>
<Movies>
  <Movie Title="Der Untergang">
    <Plot>Geschichtsfilm</Plot>
  </Movie>
  <Movie Title="Wasabi">
    <Plot>Komödie</Plot>
  </Movie>
  <Movie Title="Testing">
    <Plot>Here is a small test...</Plot>
  </Movie>
  <Movie Title="shakalak">
    <Plot>lorem ipsum</Plot>
  </Movie>
</Movies>
Diese Datei habe ich mir mit C# schon angelegt, und Einträge hinzufügen klappt auch wunderbar, aber leider kann ich nicht nach Handlungen anhand eines Titels suchen.
Habe schon gelesen, dass ich XPath brauchen werde, aber da bin ich nur bis
Code:
//Movie[@Title='Der Untergang']
gekommen, was mir den ganzen Eintrag ausspuckt.

Meine Frage also: Wie bekomme ich _nur_ die Handlung eines Filmes mit einem Titel als Suchoption aus der XML Datei?

Ich freue mich schon auf die Antworten, und sende meinen Dank im Voraus!
David
 

deepthroat

Erfahrenes Mitglied
Hi.
Code:
//Movie[@Title='Der Untergang']
gekommen, was mir den ganzen Eintrag ausspuckt.
z.B.
Code:
//Movie[@Title='Der Untergang']/Plot

Du könntest auch LINQ to XML verwenden um mit einer SQL ähnlichen Sprache in der XML Datei zu suchen und Elemente auszuwählen:
C#:
var plots = from x in XDocument.Load(@"c:\path\datei.xml").Descendants("Movie")
   where x.Attribute("Title").Value == "Der Untergang"
   select x.Descendants("Plot").Value;
Gruß
 
Zuletzt bearbeitet:

ReesClarkD

Grünschnabel
danke für die schnelle Antwort, aber mir ist leider noch immer nicht wirklich geholfen.

Ich nutze folgenden Code:
Code:
XPathNavigator nav;
            XPathDocument docNav;
            XPathNodeIterator NodeIter;
            String strExpression;

            // Open the XML.
            docNav = new XPathDocument("..\\..\\XML\\plot.xml");

            // Create a navigator to query with XPath.
            nav = docNav.CreateNavigator();

            // Find the average cost of a book.
            // This expression uses standard XPath syntax.
            strExpression = "//Movie[@Title='Der Untergang']/Plot";

            // Use the Evaluate method to return the evaluated expression.
            MessageBox.Show((nav.Evaluate(strExpression).ToString()));
XPath und XML sind selbstverständlich eingebunden. Aber: Meine Messagebox zeigt statt der Handlung nur folgendes:
MS.Internal.Xml.XPath.XPathSelectionIterator
So wie ich das verstehe muss ich jetzt wieder darauf eine Abfrage nach dem Eintrag "Plot" machen, aber wie?

Grüße,
David

PS: Deine zweite Methode schimpft wegen dem _x.Attribute("Title") == "Der Untergang"_ weil da zwei verschiedene Typen nicht aufeinander angewendet werden dürfen.
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
XPath und XML sind selbstverständlich eingebunden. Aber: Meine Messagebox zeigt statt der Handlung nur folgendes:
MS.Internal.Xml.XPath.XPathSelectionIterator
So wie ich das verstehe muss ich jetzt wieder darauf eine Abfrage nach dem Eintrag "Plot" machen, aber wie?
Die ToString() Methode ist bei soetwas nie richtig. Diese gibt nämlich immer nur den Typ des Objekts aus.

Verwende einfach die Value Property. Und schau einfach mal in die Doku bzw. suche nach Beispielen. Es gibt doch genügend im Netz. Z.B. http://www.codegod.de/WebAppCodeGod...r-XPathNodeIterator-sample-with-C-AID504.aspx
PS: Deine zweite Methode schimpft wegen dem _x.Attribute("Title") == "Der Untergang"_ weil da zwei verschiedene Typen nicht aufeinander angewendet werden dürfen.
Stimmt, da muss noch ein .Value hin. Werd ich gleich verbessern.

Gruß
 

ReesClarkD

Grünschnabel
Danke, ich werde das gleich ausprobieren.

Ist aber nicht so, als dass ich nicht im Netz gesucht hätte. Allerdings hat jeder einen anderen Ansatz, und vor allem sind die XML Dateien aus den Beispielen meist anders aufgebaut.

Ich melde mich noch einmal, wenn es klappt. Und danke für den Link!

Gruß,
David

EDIT: Hat leider nicht funktioniert. Ich schaue weiter in dem von dir genannten Beispiel, aber über weitere Hilfe würde ich mich trotzdem freuen.

EDIT #2: So, dein Link hat mir mein Problem geklärt. Vielen Dank noch einmal. So, wo stelle ich das Topic nun auf "beantwortet" ? ;-)

Hier noch die für mich funktionierende Lösung:
Code:
XPathDocument xPathDocMovies = new XPathDocument("..\\..\\XML\\plot.xml");
            XPathNavigator xPathNavMovies = xPathDocMovies.CreateNavigator();
            XPathNodeIterator xPathIterPlot = xPathNavMovies.Select("//Movie[@Title='shakalak']/Plot");

            foreach (XPathNavigator nodeMovie in xPathIterPlot)
            {
                MessageBox.Show(nodeMovie.Value);
            }
Man muss jetzt halt mit den Strings basteln, damit die Suche variabel wird, aber das klappt schon. Dnake nochmal.
 
Zuletzt bearbeitet:

Neue Beiträge