XPath / XPath in C#.NET

XPath in C#.NET

XPath in C#.NET

➪ Für die Arbeit mit XPath gibt es einen eigenen Namespace System.Xml.XPath mit diversen Klassen, die erlauben, ein XML-Dokument gezielt auszuwerten.

Bei dieser Gelegenheit kann auch gleich ein automatisiertes Testverfahren implementiert werden, das in der Lage ist, innerhalb eines XML-Dokuments mehrere XPath-Statements auszuwerten und die gefundenen Ergebnisse mit einem vordefinierten Sollwert zu vergleichen.

In der myXMLTest.xml-Konfigurationsdatei habe ich das so vordefiniert:


<?xml version="1.0" encoding="iso-8859-1"?>
<project>  
  <xpath>    
    <xmldatei>C:/wg/Ort_Elemente.xml</xmldatei>    
    <xpath_stm expected="Neustadt">
         /Orte/Ort[1]/name/text()</xpath_stm>    
    <xpath_stm expected="Darmstadt">
         /Orte/Ort[2]/name/text()</xpath_stm>    
    <xpath_stm expected="Kapstadt">
         /Orte/Ort[3]/name/text()</xpath_stm>  
    <xpath_stm expected="1">
         /Orte/Ort[1]/id/text()</xpath_stm>    
    <xpath_stm expected="2">
         /Orte/Ort[2]/id/text()</xpath_stm>    
    <xpath_stm expected="3">
         /Orte/Ort[3]/id/text()</xpath_stm>   
  </xpath> 
</project>

Ausgewertet wird das Ganze mit einem C#.NET-Snippet, das die myXMLTest.xml-Konfigurationsdatei einliest, für jeden <xpath>-Node eine eigene Auswertung generiert (d.h. die Konfigurationsdatei könnte auch mehrere XML-Dokumente ansprechen). Die Auswertung kann beliebig viele XPath-Statements betreffen, für die jeweils ein vordefinierter Wert ("expected") festgelegt wird. Das Programm vergleicht den realen mit dem erwarteten Wert und gibt entsprechende Meldungen aus.


static void myXMLtest()
{
  System.Xml.XmlDocument dom;
  dom = new System.Xml.XmlDocument();
  dom.Load(@"C:\wg\myXMLTest.xml");
  foreach (XmlNode nxpath in 
           dom.SelectNodes("/project/xpath"))
  {
    String xmldatei 
        = nxpath.SelectSingleNode("xmldatei").InnerText;
    System.Xml.XPath.XPathDocument xpd;
    xpd = new System.Xml.XPath.XPathDocument(xmldatei);
    System.Xml.XPath.XPathNavigator nav;
    nav = xpd.CreateNavigator();
    foreach(XmlNode nxpathstm in 
            nxpath.SelectNodes("xpath_stm"))
    {
      String xpathstm = nxpathstm.InnerText;
      String expected;
      expected = nxpathstm.Attributes["expected"].InnerText;  
      System.Xml.XPath.XPathExpression xpr;
      xpr = nav.Compile(xpathstm);
      //Console.WriteLine("ReturnType: {0}", xpr.ReturnType);
      if (xpr.ReturnType == 
          System.Xml.XPath.XPathResultType.Number)
      {
        try
        {
          int erg = Int32.Parse(nav.Evaluate(xpr).ToString());
          Console.WriteLine("{0}: {1}", xpr.ReturnType, erg);
        }
        catch (FormatException exc)
        {
          double erg = 
               Double.Parse(nav.Evaluate(xpr).ToString());
          Console.WriteLine("{0}: {1}; {2}", 
               xpr.ReturnType, erg, exc.Message );
        }
      }
      else if (xpr.ReturnType == 
               System.Xml.XPath.XPathResultType.String)
      {
        String erg = nav.Evaluate(xpr).ToString();
        Console.WriteLine("{0}: {1}", xpr.ReturnType, erg);
      }
      //In der Regel ist lediglich der letzte Fall relevant
      else if (xpr.ReturnType == 
               System.Xml.XPath.XPathResultType.NodeSet)
      {
        System.Xml.XPath.XPathNodeIterator iterator;
        iterator = nav.Select(xpathstm);
        foreach (System.Xml.XPath.XPathNavigator n in iterator)
        {
          if(n.OuterXml != expected)
            Console.WriteLine("FEHLER: Ergebnis: {0}; 
                               erwartet: {1}; 
                               \n\txpr.Expression: {2}", 
                               n.OuterXml, 
                               expected, 
                               xpr.Expression);
          else Console.WriteLine("Ergebnis korrekt: {0}; 
                               erwartet: {1}; 
                               \n\txpr.Expression: {2}", 
                               n.OuterXml, 
                               expected, 
                               xpr.Expression);
        }
      }
    }
  }
}

Das Ergebnis auf Console läßt sich lesen:


Datei: C:/wg/Ort_Elemente.xml
Ergebnis korrekt: Neustadt; erwartet: Neustadt; 
         xpr.Expression: /Orte/Ort[1]/name/text()
Ergebnis korrekt: Darmstadt; erwartet: Darmstadt; 
         xpr.Expression: /Orte/Ort[2]/name/text()
Ergebnis korrekt: Kapstadt; erwartet: Kapstadt; 
         xpr.Expression: /Orte/Ort[3]/name/text()
Ergebnis korrekt: 1; erwartet: 1; 
         xpr.Expression: /Orte/Ort[1]/id/text()
Ergebnis korrekt: 2; erwartet: 2; 
         xpr.Expression: /Orte/Ort[2]/id/text()
Ergebnis korrekt: 3; erwartet: 3; 
         xpr.Expression: /Orte/Ort[3]/id/text()

wg / 15. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XPath_csharp.html