xpath2 - XPath2 1.1.5

This is an implementation of W3C XML Path Language (XPath) 2.0 for .NET based on standard XPathNavigator API.

PM> Install-Package XPath2 -Version 1.1.5 -Source https://www.myget.org/F/xpath2/api/v3/index.json

Copy to clipboard

> nuget.exe install XPath2 -Version 1.1.5 -Source https://www.myget.org/F/xpath2/api/v3/index.json

Copy to clipboard

> dotnet add package XPath2 --version 1.1.5 --source https://www.myget.org/F/xpath2/api/v3/index.json

Copy to clipboard
<PackageReference Include="XPath2" Version="1.1.5" />
Copy to clipboard
source https://www.myget.org/F/xpath2/api/v3/index.json

nuget XPath2  ~> 1.1.5
Copy to clipboard

> choco install XPath2 --version 1.1.5 --source https://www.myget.org/F/xpath2/api/v2

Copy to clipboard
Import-Module PowerShellGet
Register-PSRepository -Name "xpath2" -SourceLocation "https://www.myget.org/F/xpath2/api/v2"
Install-Module -Name "XPath2" -RequiredVersion "1.1.5" -Repository "xpath2" 
Copy to clipboard

XPath2.Net : Lightweight XPath2 for .NET

This is an implementation of W3C XML Path Language (XPath) 2.0 for .NET Framework based on standard XPathNavigator API. The given implementation based on practice of developing XQuery is fully corresponding to the specification demands.

Project is copied and forked from https://xpath2.codeplex.com/. Original credits go to Semyon A. Chertkov.

Build

Quality  
  Build Azure Build Status
  CodeFactor CodeFactor
  Sonar Quality Gate Sonar Quality Gate
  Sonar Bugs Sonar Bugs
  Sonar Code Smells Sonar Code Smells
  Sonar Coverage Sonar Coverage
NuGet  
  XPath2 NuGet Badge
  XPath2.Extensions NuGet Badge
MyGet (previews)  
  XPath2 MyGet
  XPath2.Extensions MyGet

Supported frameworks

  • .NET 3.5
  • .NET 4.0 and up
  • .NET Standard 2.0 & 2.1
  • Mono 4 and up

Info

It conforms for 12954 * from 15133 (85.60%) regarding the test-set XQTSCatalog.xml (XQTS 1.0.2 Nov. 20, 2006) at https://dev.w3.org/2006/xquery-test-suite/PublicPagesStagingArea/

* Note that depending on your system, you can get 12958 to work. This is because of some tests which test the lowercase functionality from 'K' (Kelvin-sign). More details see this question.

API used is an anology to the standard one built into the platform: you utilize XPath2Expression instead of the common XPathExpression and a set of extension functions for XNode, XPathNavigator and XmlNode classes.

System.Xml.XPath WmHelp.XPath2
XPathNavigator.Evaluate() XPathNavigator.XPath2Evaluate()
XmlNode.SelectNodes() XmlNode.XPath2SelectNodes()
XmlNode.SelectSingleNode() XmlNode.XPath2SelectSingleNode()
XNode.Select XNode.XPath2Select
..., etc. ..., etc.

In addition there parameterized XPath2 expressions are implemented that allow to compose XQuery requests by standard Linq-to-XML means. Though it is not generally necessary to use XPath during writing Linq-to-XML queries nevertheless they allow to make it simple. To pass variable values into XPath expression we use C# 4.0 anonimous structures, e.g. new creates variable $varname,... inside XPath expression.

Here are examples of some W3C XQuery usecases and their translations into C# and LINQ.

XQuery (RQ2.xq)

<result>
  {
    for $i in doc("items.xml")//item_tuple
    let $b := doc("bids.xml")//bid_tuple[itemno = $i/itemno]
    where contains($i/description, "Bicycle")
    order by $i/itemno
    return
        <item_tuple>
            { $i/itemno }
            { $i/description }
            <high_bid>{ max($b/bid) }</high_bid>
        </item_tuple>
  }
</result> 

C#

XNode items = XDocument.Load("items.xml");
XNode bids = XDocument.Load("bids.xml");
XNode result = new XDocument(
    new XElement("result",
        (from item in items.XPath2SelectElements("//item_tuple")
                .OrderBy((elem) => (string)elem.Element("itemno"))                       
            let bid = bids.XPath2Select<XElement>("//bid_tuple[itemno = $i/itemno]", new { i = item })
            where ((string)item.Element("description")).Contains("Bicycle")
            select new XElement("item_tuple", 
                item.Element("itemno"),
                item.Element("description"),
                !bid.Any() ?  null :
                    new XElement("high_bid", 
                        bid.AsQueryable().Max((elem) => (double)elem.Element("bid"))))))
);

XQuery (RQ3.xq)

<result>
  {
    for $u in doc("users.xml")//user_tuple
    for $i in doc("items.xml")//item_tuple
    where $u/rating > "C" 
       and $i/reserve_price > 1000 
       and $i/offered_by = $u/userid
    return
        <warning>
            { $u/name }
            { $u/rating }
            { $i/description }
            { $i/reserve_price }
        </warning>
  }
</result>

C#

XNode users = XDocument.Load("users.xml");
XNode items = XDocument.Load("items.xml");
XNode result = 
    new XElement("result",
        (from user in users.XPath2SelectElements("//user_tuple")
            from item in items.XPath2SelectElements("//item_tuple")
            where (bool)XPath2Expression.Evaluate(@"$u/rating > 'C' and $i/reserve_price > 1000 
                    and $i/offered_by = $u/userid", new { u = user, i = item })
            select new XElement("warning",
                user.Element("name"),
                user.Element("rating"),
                item.Element("description"),
                item.Element("reserve_price"))));

XQuery (RQ9.xq)

<result>
  {
    let $end_dates := doc("items.xml")//item_tuple/end_date
    for $m in distinct-values(for $e in $end_dates 
                              return month-from-date($e))
    let $item := doc("items.xml")
        //item_tuple[year-from-date(end_date) = 1999 
                     and month-from-date(end_date) = $m]
    order by $m
    return
        <monthly_result>
            <month>{ $m }</month>
            <item_count>{ count($item) }</item_count>
        </monthly_result>
  }
</result>

C#

XNode items = XDocument.Load("items.xml");
var endDates = items.XPath2SelectElements("//item_tuple/end_date");
XNode result = 
    new XElement("result",
        (from month in XPath2Expression.SelectValues(@"distinct-values(for $e in $end_dates 
                    return month-from-date($e))", new { end_dates = endDates }).OrderBy((arg) => arg)
            let item = items.XPath2SelectElements(@"//item_tuple[year-from-date(end_date) = 1999 
                    and month-from-date(end_date) = $m]", new { m = month })
            select new XElement("monthly_result",
                new XElement("month", month),
                new XElement("item_count", item.Count())
            )));

See ReleaseNotes.md

  • .NETFramework 4.0
  • .NETFramework 4.5.2
  • .NETStandard 2.0
  • .NETStandard 2.1
  • .NETFramework 4.0: 4.0.0.0
  • .NETFramework 4.5.2: 4.5.2.0
  • .NETStandard 2.0: 2.0.0.0
  • .NETStandard 2.1: 2.1.0.0

Owners

Stef

Authors

Semyon A. Chertkov and Stef Heyenrath

Project URL

https://github.com/StefH/XPath2.Net

License

MS-PL

Tags

XPath XPath2 XPath2.0 Xml W3C XQuery XQTS

Info

52 total downloads
4 downloads for version 1.1.5
Download (458.69 KB)
Found on the current feed only

Package history

Version Size Last updated Downloads Mirrored?
1.1.5 458.69 KB Fri, 06 Sep 2024 13:56:23 GMT 4
1.1.4 458.73 KB Fri, 22 Mar 2024 11:00:02 GMT 5
1.1.3 458.48 KB Tue, 28 Nov 2023 21:09:57 GMT 5
1.1.2 445.77 KB Mon, 25 Apr 2022 14:44:13 GMT 5
1.1.1 445.44 KB Tue, 22 Jun 2021 16:33:17 GMT 5
1.1.0 445 KB Fri, 18 Jun 2021 19:39:00 GMT 5
1.0.12 442.99 KB Sun, 06 Sep 2020 19:38:57 GMT 5
1.0.11 441.09 KB Fri, 08 May 2020 06:14:22 GMT 6
1.0.10-ci-1879 330.36 KB Wed, 11 Sep 2019 18:44:03 GMT 5
1.0.10-ci-1876 330.37 KB Wed, 11 Sep 2019 12:32:45 GMT 7