Query's uitvoeren op XML met een XPath-expressie in Visual C#

In dit artikel wordt beschreven hoe u een query uitvoert op een XPathDocument object met behulp van een XPath-expressie (XML Path Language) en de XPathNavigator klasse.

XPath wordt programmatisch gebruikt om expressies te evalueren en specifieke knooppunten in een document te selecteren.

Dit artikel verwijst naar de Microsoft .NET Framework Class Library-naamruimte. System.Xml.XPath

Van toepassing op: Visual Studio, .NET Framework

Oorspronkelijk KB-nummer: 308333

Vereiste voorwaarden

In dit artikel wordt ervan uitgegaan dat u bekend bent met de volgende onderwerpen:

  • Visual C#
  • XML-terminologie
  • Een XML-bestand maken en lezen
  • XPath-syntaxis

Query XPathDocument met een XPath-expressie

  1. Maak in Microsoft Visual Studio een Visual C#-consoletoepassing.

    Notitie

    In dit voorbeeld wordt een bestand met de naam Books.xmlgebruikt. U kunt uw eigen Books.xml-bestand maken of u kunt het voorbeeld gebruiken dat is opgenomen in de quickstarts van de .NET Software Development Kit (SDK).

    Als u de quickstarts niet hebt geïnstalleerd en u deze niet wilt installeren, raadpleegt u de sectie Gerelateerde inhoud voor de Books.xml downloadlocatie.

    Als u de quickstarts hebt geïnstalleerd, kunt u het bestand Books.xml vinden in de Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transforxml\VB map. U kunt het bestand kopiëren naar de \Bin\Debug submap van de map waarin u dit project hebt gemaakt.

  2. Zorg ervoor dat het project verwijst naar de System.Xml naamruimte.

  3. Gebruik de using instructie voor de Xml en XPath naamruimten, zodat u geen declaraties in die naamruimten later in uw code hoeft in aanmerking te komen. U kunt de using instructie als volgt gebruiken voor andere declaraties:

    using System.Xml;
    using System.Xml.XPath;
    
  4. Declareer de juiste variabelen. Declareer een XPathDocument object voor het OPSLAAN van het XML-document, een XpathNavigator object om XPath-expressies te evalueren en een XPathNodeIterator object om door geselecteerde knooppunten te doorlopen. Declareer een String object voor het opslaan van de XPath-expressies. Voeg de declaratiecode toe aan de Main functie in Class1.

    XPathNavigator nav;
    XPathDocument docNav;
    XPathNodeIterator NodeIter;
    String strExpression;
    
  5. Laad een XPathDocument bestand samen met het voorbeeldbestand Books.xml. De XPathDocument klasse maakt gebruik van Extensible Stylesheet Language Transformations (XSLT) om een snelle en prestatiegerichte cache te bieden voor XML-documentverwerking. Het is vergelijkbaar met het XML Document Object Model (DOM), maar is sterk geoptimaliseerd voor XSLT-verwerking en het XPath gegevensmodel.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Maak een XPathNavigator van het document. Het XPathNavigator object wordt gebruikt voor alleen-lezen XPath-query's. De XPath-query's kunnen een resulterende waarde of veel knooppunten retourneren.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Maak een XPath-expressie om de gemiddelde kosten van een boek te vinden. Deze XPath-expressie retourneert één waarde. Zie XPath-syntaxis in de sectie Verwijzingen voor meer informatie over de XPath-syntaxis.

    // Find the average cost of a book.
    // This expression uses standard XPath syntax.
    strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";
    
  8. Gebruik de Evaluate methode van het XPathNavigator object om de XPath-expressie te evalueren. De Evaluate methode retourneert de resultaten van de expressie.

    // Use the Evaluate method to return the evaluated expression.
    Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));
    
  9. Maak een XPath-expressie om alle boeken te vinden die meer dan 10 dollar kosten. Deze XPath-expressie retourneert alleen titelknooppunten uit de XML-bron.

    // Find the title of the books that are greater then $10.00.
    strExpression = "/bookstore/book/title[../price>10.00]";
    
  10. Maak een XPathNodeIterator voor de nodes in combinatie met de Select-methode van de XPathNavigator. Het XPathNodeIterator vertegenwoordigt een XPath-knooppuntset en ondersteunt bewerkingen op deze knooppuntset.

    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
    
  11. Als u door de geselecteerde knooppunten wilt gaan, gebruikt u de XPathNodeIterator die is geretourneerd door de Select methode van XPathNavigator. In dit geval kunt u de MoveNext-methode van de XPathNodeIterator gebruiken om door alle geselecteerde knooppunten te itereren.

    Console.WriteLine("List of expensive books:");
    //Iterate through the results showing the element value.
    while (NodeIter.MoveNext())
    {
        Console.WriteLine("Book Title: {0}", NodeIter.Current.Value);
    };
    
  12. Gebruik de ReadLine methode om aan het einde van de consoleweergave een pauze toe te voegen om de resultaten uit de vorige stappen gemakkelijker weer te geven.

    // Pause
    Console.ReadLine();
    
  13. Bouw uw project en voer het uit.

    Notitie

    De resultaten worden weergegeven in het consolevenster.

Probleemoplossing

Wanneer u de code test, ontvangt u mogelijk het volgende uitzonderingsfoutbericht:

An unhandled exception of type System.Xml.XmlException occurred in System.xml.dll  
Additional information: System error.

Deze uitzondering treedt op in de volgende regel van de code.

docNav = new XPathDocument("c:\\books.xml");

De fout wordt veroorzaakt door een ongeldige verwerkingsinstructie. De verwerkingsinstructie kan bijvoorbeeld overbodige spaties bevatten. Het volgende voorbeeld is een ongeldige verwerkingsinstructie:

<?xml version='1.0' ?>

Gebruik een van de volgende oplossingen om de uitzondering op te lossen:

  • Corrigeer de ongeldige verwerkingsinstructie. Het volgende voorbeeld is een geldige verwerkingsinstructie:

    <?xml version='1.0'?>
    
  • Verwijder de XML-verwerkingsinstructie uit het Books.xml-bestand.