{"id":39629554,"url":"https://github.com/mluis7/xml2xpath","last_synced_at":"2026-01-18T08:41:45.762Z","repository":{"id":31770494,"uuid":"128846689","full_name":"mluis7/xml2xpath","owner":"mluis7","description":"XML to XPath generator. Extracts XPath expressions from XML or HTML file with namespace support","archived":false,"fork":false,"pushed_at":"2025-07-09T20:02:45.000Z","size":289,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-09T21:16:24.951Z","etag":null,"topics":["html","html5","xml","xpath"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mluis7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-04-09T23:45:38.000Z","updated_at":"2025-07-09T20:01:08.000Z","dependencies_parsed_at":"2024-06-19T03:39:19.303Z","dependency_job_id":"7e689b6d-2952-4cac-bc47-f75f532a014f","html_url":"https://github.com/mluis7/xml2xpath","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/mluis7/xml2xpath","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mluis7%2Fxml2xpath","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mluis7%2Fxml2xpath/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mluis7%2Fxml2xpath/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mluis7%2Fxml2xpath/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mluis7","download_url":"https://codeload.github.com/mluis7/xml2xpath/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mluis7%2Fxml2xpath/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["html","html5","xml","xpath"],"created_at":"2026-01-18T08:41:45.022Z","updated_at":"2026-01-18T08:41:45.735Z","avatar_url":"https://github.com/mluis7.png","language":"Shell","funding_links":["https://www.paypal.com/donate/?hosted_button_id=WBY3Y35L2P7UQ"],"categories":[],"sub_categories":[],"readme":"# xml2xpath\nCommand line XPath expressions generator. Works on XML/HTML files and includes attributes as well.\n\nA wrapper around `xmllint` tool that provides convenience options to inspect documents listing namespaces and xpaths expressions.\nBy default, shows xpaths expressions starting at the root element but it can start at a predefined element passed from command line as an xpath expression.\n\n| :exclamation:  Python3 implementation available |\n|-------------------------------------------------|\n\u003ch3\u003e \u0026#x24D8; Check \u003ca href=\"https://github.com/mluis7/pyxml2xpath\"\u003epyxml2xpath\u003c/a\u003e python implementation as module or CLI \u003ca href=\"https://github.com/mluis7/pyxml2xpath\"\u003ehere\u003c/a\u003e!\u003c/h3\u003e\n\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?hosted_button_id=WBY3Y35L2P7UQ)\n\nTable of contents\n=================\n\n* [Basic usage](#basic-usage)\n* [Using found XPaths](#using-found-xpaths)\n* [XPaths on HTML](#xpaths-on-html)\n* [Absolute paths and namespaces](#absolute-paths-and-namespaces)\n* [Default namespaces](#default-namespaces)\n* [XPath expressions at a given element](#xpath-expressions-at-a-given-element)\n* [Using found XPaths](#using-found-xpaths)\n* [TL;DR](#tldr)\n* [Generate an XML from an XSD and show its XPaths](#generate-an-xml-from-an-xsd-and-show-its-xpaths)\n* [Performance](#performance)\n    - [Passing xpath expression of a single element](#passing-xpath-expression-of-a-single-element)\n    - [Extracting a single element to a file](#extracting-a-single-element-to-a-file)\n    - [Timeouts](#timeouts)\n* [Script help](#help)\n* [Known issues](#known-issues)\n* [Generate man page](#generate-man-page)\n* [Rationale](#rationale)\n\n## Basic usage\nGet all element xpaths from an XML file. To show attribute XPaths also, add `-a` (absolute XPaths)\n\n`xml2xpath.sh -x soap.xml`\n\nResult:\n\n    xml2xpath: find XPath expressions on soap.xml\n       -x ; XML file: soap.xml\n    \n    Namespaces:\n    soap1=http://schemas.xmlsoap.org/soap/envelope/xxxxxxxxx\n    soap=http://schemas.xmlsoap.org/soap/envelope/\n    defaultns=http://example.com\n    \n    Found 4 XPath expressions (unique, use -r to override):\n    \n    /soap:Envelope\n    /soap:Envelope/soap:Body\n    /soap:Envelope/soap:Body/defaultns:incident\n    /soap:Envelope/soap:Body/defaultns:incident/defaultns:Company\n\n## Using found XPaths\nFound relative or absolute XPaths expressions can be tested on browser development tools.\n\n**Inspector or Elements tabs**  \nBrowsers might expect elements on xpath that do not exists on html source.  \nThe script found:\n\n`/html/body/center[2]/table/tr[2]/td[1]`\n\nBut browser will accept (`tbody` must be added)\n\n`/html/body/center[2]/table/tbody/tr[2]/td[1]` \n\nRelative expressions are also valid. All below could point to the same `td` element\n\n\t//center[2]/table[@id='t1']//tr[2]/td[1]\n\t//center[2]/*//tr[2]/td[1]\n\t//center[2]/descendant::*/td[1]\n\t//center[2]/descendant::*/td[position()=1]\n\n**Console**  \nFirefox and Chrome offer `$x` built-in object to search elements using absolute or relative xpath expressions.  \nHovering over the found elements on console might highlight the element on the page.  \nClicking on the elements will show the element on Inspector tab\n\n`$x(\"/html/body/center[2]/table/tbody/tr\")`\n\nResult:\n\n`(4) [tr, tr, tr, tr]`\n\nOr for a single element:  \n\n`$x(\"//center[2]/table/tbody/tr[2]\")`\n\nResult (expanded):\n\n\t(1) […]\t​\n\t    0: \u003ctr\u003e​\n\t    length: 1\n\t​    \u003cprototype\u003e: Array []\n\n\n**Generic numeric XPaths to Xpaths with Element names**  \n\nGiven this xpaths generated with `-a -g` it says there are 4 `entry` elements where the first has the absolute position 8 for any element.\n\n    / \u003e whereis //defaultns:entry\n    /*/*[8]\n    /*/*[9]\n    /*/*[10]\n    /*/*[11]\n\nThe first one `/*/*[8]` would be equivalent to `//defaultns:entry[1]`, the eight element and the first `entry` element for that xpath expression.\n\nFind all attributes under a qualified path with this shell command\n\n    (echo \"setrootns\"; echo \"cat /defaultns:feed/defaultns:entry/defaultns:link/@*\") | xmllint --shell wiki.xml \n    \nResult showing `rel`, `type` and `href` attributes:\n\n    / \u003e setrootns\n    / \u003e cat /defaultns:feed/defaultns:entry/defaultns:link/@*\n    -------\n    rel=\"alternate\"\n    -------\n    type=\"text/html\"\n    -------\n    href=\"https://en.wikipedia.org/w/index.php?title=Title%202\"\n    -------\n    rel=\"alternate\"\n    -------\n    type=\"text/html\"\n    -------\n    href=\"https://en.wikipedia.org/w/index.php?title=some_title\"\n    / \u003e\n\nFind `@rel` attribute under a specific path with this shell command\n\n    (echo \"setrootns\"; echo \"cat /*/*[8]/*[3]/@rel\") | xmllint --shell wiki.xml \n\nResult of specific `@rel` attribute:\n\n    / \u003e setrootns\n    / \u003e cat /*/*[8]/*[3]/@rel\n    -------\n    rel=\"alternate\"\n\n \n \nAdding `p` allows to pass a namespace prefix to search for (experimental).\n\n## XPaths on HTML\n\n`xml2xpath.sh -a -s '//table[2]/thead/tr' -l resources/test.html`\n\nResult:\n\n\tNamespaces:\n\t\n\t  xml http://www.w3.org/XML/1998/namespace\n\t\n\t\n\tFound Xpath (absolute):\n\t\n\t/html/body/table[2]/thead/tr\n\t/html/body/table[2]/thead/tr/@class\n\t/html/body/table[2]/thead/tr/th[1]\n\t/html/body/table[2]/thead/tr/th[2]\n\t/html/body/table[2]/thead/tr/th[3]\n\t/html/body/table[2]/thead/tr/th[4]\n\n## Absolute paths and namespaces\nGiven an XML with namespaces, the following command will show absolute paths in numeric format\n\n`xml2xpath.sh -a -n -x wiki.xml`\n\n`xmllint` does not show element names in full paths\n\n    /*\n    /*/*[8]\n    /*/*[9]\n    /*/*[8]/*[6]\n    /*/*[9]/*[6]\n    /*/*[8]/*[3]/@rel\n    /*/*[8]/*[3]/@type\n    /*/*[8]/*[3]/@href\n\nAdding `-g` would show the qualified xpath used to generate absolute paths\n\n    / \u003e whereis /defaultns:feed/defaultns:entry\n    /*/*[8]\n    /*/*[9]\n    / \u003e whereis /defaultns:feed/defaultns:entry/defaultns:author\n    /*/*[8]/*[6]\n    /*/*[9]/*[6]\n    / \u003e whereis /defaultns:feed/defaultns:entry/defaultns:author/defaultns:name/@*\n    / \u003e whereis /defaultns:feed/defaultns:entry/defaultns:id/@*\n    / \u003e whereis /defaultns:feed/defaultns:entry/defaultns:link/@*\n    /*/*[8]/*[3]/@rel\n    /*/*[8]/*[3]/@type\n    /*/*[8]/*[3]/@href\n    /*/*[9]/*[3]/@rel\n    /*/*[9]/*[3]/@type\n    /*/*[9]/*[3]/@href\n\nThis XPath\n\n    /defaultns:feed/defaultns:entry/defaultns:author\n\nCould generate\n\n    /*/*[8]/*[6]\n    /*/*[9]/*[6]\n\n## Default namespaces\nThis start root element has a default namespace, i.e. without a prefix\n\n`\u003cfeed xmlns=\"http://www.w3.org/2005/Atom\" xml:lang=\"en\"\u003e`\n\nPassing `-n` will map that namespace to a `defaultns` prefix by default.\nTo change that, pass `-o` option with the desired definition in the form `\u003cprefix\u003e=\u003curi\u003e`.\n\n`xml2xpath.sh -n -o 'ns1=http://www.w3.org/2005/Atom' -s '//ns1:entry[descendant::ns1:name[.=\"author2\"]]' -x tests/resources/wiki.xml`\n\nTry this command:\n\n`xml2xpath.sh -a -g -n -o 'ns1=http://www.w3.org/2005/Atom' -s '//ns1:entry[descendant::ns1:name[.=\"author2\"]]' -t -x tests/resources/wiki.xml`\n\n## XPath expressions at a given element\nPassing `-s` option to show xpath expressions starting at an specific element or elements.\n\n`xml2xpath.sh -n -s '//defaultns:entry/defaultns:author' -x wiki.xml`\n\nResult:\n\n    xml2xpath: find XPath expressions on wiki.xml\n       -n ; default ns prefix: defaultns\n       -s ; Start tree at: '//defaultns:entry/defaultns:author' (du_path)\n       -x ; XML file: wiki.xml\n    \n    Namespaces:\n    defaultns=http://www.w3.org/2005/Atom\n    \n    Found 6 XPath expressions (unique, use -r to override):\n    \n    //defaultns:entry/defaultns:author\n    //defaultns:entry/defaultns:author/defaultns:name\n\n## TL;DR\n\n\u003e You see, in this world there's two kinds of people, my friend:  \n\u003e Those with loaded guns and those who dig.  \n\u003e You dig.   \n\u003e \n\u003e (The Good, The Bad and The Ugly)\n\n_... those with TL;DR, and those who read._  \n_You read._\n\n:smirk: :satisfied:\n\nStart by passing the xpath expression of a known element in the tree and get the xpath expression of the elements under it.\nTry these commands over already provided samples:\n\n    ./xml2xpath.sh -a -s \"//table[@id[.='t1']]\" -l tests/resources/test.html\n\n    ./xml2xpath.sh -o 'defns=urn:hl7-org:v3' -s '//defns:addr' -x tests/resources/HL7.xml\n\n## Running tests\nSmoke tests for the script to quickly verify that changes did not break any functionality.\nTests results show the tested command which can be tried on console to witness how those options work.\n\nRun all at once with `test-all.sh` or one at a time\n\n     cd tests\n     ./test-all.sh\n     \n     ./test-html-base.sh \n\nResult:\n\n\t*** HTML tests ***\n\n\tTC01   : Basic test (-l)\n\tcmd    : ../xml2xpath.sh  -l resources/test.html\n\tPASSED\n\t...\n\t...\n\nPrint more details by running as\n\n    dbg=1 ./test-all.sh\n\nThe command used for testing is shown in details. Run it to see it in action (adding missing quotes if needed :-p )\n\n    ../xml2xpath.sh -a -s \"//table[@id[.='t1'] and descendant::tr[@class='headerRow']]\" -l resources/test.html\n    \nTo log a trace of test commands to a file run\n\n    dbg=1; trace=\"$HOME/tmp/all-tests.log\" ./test-all.sh\n\nTo test several instances running in background or simultaneously (issue #15)\n\n    BG=1 ./test-all.sh\n\n## Generate an XML from an XSD and show its XPaths\nIf an XSD file is provided and **xmlbeans** package is installed, try to create an XML instance and print the XPath from it.\n\nTaking [an XSD example from w3schools](https://www.w3schools.com/xml/schema_example.asp) the script will print\n\n`xml2xpath.sh -a -f shiporder -d shiporder.xsd `\n\nResult:\n\n    Creating XML instance starting at element shiporder from shiporder.xsd\n\n\n    Found Xpath (absolute):\n\n    /shiporder\n    /shiporder/@orderid\n    /shiporder/item\n    /shiporder/item/note\n    /shiporder/item/price\n    /shiporder/item/quantity\n    /shiporder/item/title\n    /shiporder/orderperson\n    /shiporder/shipto\n    /shiporder/shipto/address\n    /shiporder/shipto/city\n    /shiporder/shipto/country\n    /shiporder/shipto/name\n\nRelative paths starting at an element are also possible\n\n`xml2xpath.sh -s '//shipto' -f shiporder -d shiporder.xsd `\n\nResult:\n\n    Creating XML instance starting at element shiporder from shiporder.xsd\n\n    Found XPath:\n\n    //shipto\n    //shipto/name\n    //shipto/address\n    //shipto/city\n    //shipto/country\n\nIf -t option is passed it will print XML elements tree also\n\n\tshiporder\n\t  orderperson\n\t  shipto\n\t    name\n\t    address\n\t    city\n\t    country\n\t  item\n\t    title\n\t    note\n\t    quantity\n\t    price\n\n## Rationale\nIt is a wrapper around `xmllint` interactive shell that automates the inspection of XML/HTML files, looking for XPath expressions taking into account namespaces.  \nThe goal is to get as much information as possible without writing a parser. Code is focused on getting information and presenting the results as usefully as possible.  \n\nMain commands sent to interactive shell are:  \n\n**Find namespaces**\n\n```bash\necho \"ls /some/xpath/namespace::*\" | xmllint --shell file.xml\n\n/ \u003e ls /*/namespace::*[local-name()!='xml']\nn        1 default -\u003e http://example.com/ns1\nn        1 soap -\u003e http://schemas.xmlsoap.org/soap/envelope/\n...\n\necho \"xpath /some/xpath\" | xmllint --shell file.xml\n\n/ \u003e xpath /*//*\nObject is a Node Set :\nSet contains 3 nodes:\n1  ELEMENT soap:Body\n2  ELEMENT incident\n    default namespace href=http://example.com/ns2\n...\n```\n\n**Get elements tree**  \nKey command is `du` since it offers a tree representation with indented elements so \"flattening\" that tree provides simple XPath   \nexpressions like `/feed/entry/title`. \n\n```\necho \"du /\" | xmllint --shell resources/wiki.xml \n\n# result\n/ \u003e du /\n/\nfeed\n  id\n  title\n  link\n  subtitle\n  entry\n    id\n    title\n```\n\n**Get absolute xpath expressions**\nXPath expressions found by `du` command are used to find absolute XPath expressions. Namespaces must be set for this command to success.\nXPath for attributes could look like `/feed/entry/title/@*`.\n\n```\n(echo \"setrootns\"; echo \"whereis /defaultns:feed/defaultns:entry/defaultns:title\") | xmllint --shell resources/wiki.xml\n\n# result\n/ \u003e setrootns\n/ \u003e whereis /defaultns:feed/defaultns:entry/defaultns:title\n/*/*[8]/*[2]\n/*/*[9]/*[2]\n/*/*[10]/*[2]\n```\n\n## Performance\nParsing big documents might take a long time. As an example, [this 1M elements sample document](http://aiweb.cs.washington.edu/research/projects/xmltk/xmldata/data/tpc-h/lineitem.xml.gz) took almost 2 hours to just find 17 different expressions. As many large xml documents, that sample has the same elements repeated many times.  \nThis wrapper looks for XPath expressions, not content so inspecting just one of those many elements would be enough.  \nThat can be done in 2 ways, specifying the xpath of the first known element or extracting that first element to another file as we'll see next.\n\n### Timeouts\nOccasionally an due to external factors like computer performance, antivirus, etc., the script [could fail with a timeout error](https://github.com/mluis7/xml2xpath/issues/11)\n\n`Timeout reading from file descriptor 142 (parse ns stage1) . Current timeout: 5 secs. Try extending the timeout with: XML_XPATH_RTOUT=[int or float \u003e 5] xml2xpath.sh ...`\n\nRead timeout can be extended by setting/using `XML_XPATH_RTOUT` environmental variable\n\n```\nexport XML_XPATH_RTOUT=15\n./xml2xpath.sh -x tests/resources/HL7.xml\n```\n\nOr\n\n`XML_XPATH_RTOUT=15 ./xml2xpath.sh -x tests/resources/HL7.xml`\n\n### Passing xpath expression of a single element\n\n    time xml2xpath.sh -a -g -s '/table/T[1]//*' -x big/lineitem.xml\n\n### Extracting a single element to a file\nThis simple command will extract the first `entry` element to `wiki-1.xml` file. Parsing that file would be more efficient. \n\n    (echo \"setrootns\"; echo \"cd /defaultns:feed/defaultns:entry[1]\"; echo \"write wiki-1.xml\"; echo \"bye\") | xmllint --shell --format wiki-big.xml\n\n## Help\n\n```text\nPrint XPath present on xml or (if possible) xsd files. Based on xmllint utility, try to build all possible XPaths from an XML instance. The latter could be constructed from a provided XSD file.\n\nUsage: xml2xpath.sh [-h -v -q] [-d file -f \u003ctag name\u003e] [-a -g -t -s \u003cxpath\u003e] [-n -p \u003cns prefix\u003e -o \u003cprefix\u003e=URI -x \u003cfile\u003e] [-l \u003cfile\u003e]\n       xml2xpath.sh [-h -v] [XSD OPTIONS] [COMMON XML/HTML OPTIONS] [XML OPTIONS] [HMTL OPTIONS]\n\n\nOptions:\n\nBasic:\n  -h    print this help message.\n  -q    do not print information messages, just xpath list.\n  -v    print version\n\nXML/HTML Common Options:\n  -a    Show absolute Xpaths. Use -g too to add details. -s is used to filter but absolute paths are shown.\n  -g    Print xmllint command for debugging or clarity. Implies -a.\n  -r    Print repeated xpaths when -a is used. For debugging only.\n  -s    Start printing XPath at an absolute or relative xpath, e.g.: /shiporder/shipto, //shipto.\n          Must contain namespace prefix if needed. e.g.: //defaultns:entry, //xs:element\n  -t    print XML element tree as provided by xmllint 'du' shell command.      \n\nHTML options:\n  -l    Use HTML parser\n\nXML options:\n  -n    Set namespaces found on root element. Default namespace prefix is 'defaultns' but may be overriden with -o option.\n  -o    Override the default namespace definition by passing \u003cprefix\u003e=URI, e.g.: -o 'defns=urn:hl7-org:v3'\n  -p    Namespace prefix to use. No need to pass -n if used and takes precedence if it is.\n  -x    xml file, will take precedence over -d option.\n\nXSD options:\n  -d    xsd file path.\n  -D    Same as -d but saves created xml instance to \u003cxsd file path\u003e.xml\n  -f    name of the root element to build xml from xsd.\n  \nExamples:\n\n  xml2xpath.sh -t -x test.xml                                          Print all xpaths and elements tree\n\n  xml2xpath.sh -s '//shipto' -x test.xml                               Print xpaths starting at //shipto element\n    \n  xml2xpath.sh -a -f shiporder -d tests/resources/shiporder.xsd        Print xpaths from generated xml\n\n  xml2xpath.sh -a -n -g -x wiki.xml                                    Use namespaces, show absolute paths and xmllint shell messages\n    \n  xml2xpath.sh -o 'defns=urn:hl7-org:v3' -s '//defns:addr' -x HL7.xml  Add a namespace definition and use it in a relative expression    \n    \n  xml2xpath.sh -a -n -l test.html                                      Html file with absolute paths option\n\nEnvironment:\n  XML_XPATH_RTOUT  Set XML file the read timeout. Default 5s.\n\n  XMLBEANS_HOME  Set Apache XmlBeans home for xml instance creation from xsd file. Default: /usr/share/java/xmlbeans\n\nBugs:\n  Report found bugs or feature requests at https://github.com/mluis7/xml2xpath/issues\n```\n\n## Generate man page\nUse this command with `help2man` utility  \n`help2man --locale=en_US --no-info --help-option='-h' --version-option='-v' xml2xpath.sh -o man/xml2xpath.sh.1`\n\nTo test the generated man page use:  \n`MANPATH=\"./man\" man man/xml2xpath.sh.1`\n\n## Known issues\n* `-s` used with `-p` does not find xpath expressions when default namespace is NOT declared at root element.  \nFollowing tests refers to documents in `tests/resources`directory.  \n\nWhat works:  \n```\nxml2xpath.sh -n -p 'ns' -s \"//defaultns:addr\" -x tests/resources/HL7.xml\nxml2xpath.sh -n -o 'ns=urn:g' -s '//ns:x' -x tests/resources/ns-with-default.xml\n# -p is ignored\nxml2xpath.sh -n -p \"nxx\" -o 'ns1=http://example.com/ns1' -s '//ns1:incident' -x tests/resources/soap.xml\n```\n\nWhat does not work:  \n` xml2xpath.sh -n -p 'ns' -s '//ns:x' -x tests/resources/ns-with-default.xml`\n\n[Performance](#performance) with big documents can always be an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmluis7%2Fxml2xpath","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmluis7%2Fxml2xpath","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmluis7%2Fxml2xpath/lists"}