JSON & XML Tools
Tools Guides About Contact

XPath basics for XML configuration files

Query nested XML without writing a custom parser

Updated: June 2026 · All guides

Enterprise apps, build systems, and legacy integrations still ship configuration as XML. XPath is the standard query language for selecting nodes in an XML tree — one expression can answer “give me every database host in production” without loading the file into code. This guide covers XPath 1.0 syntax with examples you can paste into XPath Studio on webtoolkit.in.

Sample document

<config>
  <environment name="production">
    <database host="db.prod.example" port="5432"/>
    <feature flags="checkout,beta"/>
  </environment>
  <environment name="staging">
    <database host="db.stage.example" port="5432"/>
  </environment>
</config>

Core selectors

  • /config/environment — all environment elements under root
  • //database — every database element anywhere in the tree
  • /config/environment[@name='production'] — environment with name attribute production
  • //database/@host — host attribute values
  • //environment[1]/database — first environment’s database child

Predicates (filters in square brackets)

Predicates narrow node sets. //environment[@name='production']/database/@port returns 5432. //database[@port > 5000] compares numerically in XPath 1.0 when values look like numbers.

Text content: //feature[contains(@flags,'beta')] finds features whose flags attribute contains the substring beta.

Functions you will use daily

  • count(//environment) — number of matching nodes
  • string-length(//database/@host) — length of attribute value
  • concat(//database/@host, ':', //database/@port) — build connection strings
  • normalize-space(//text()) — trim whitespace from text nodes

Namespaces

Config files often use namespaces (xmlns="..."). Unprefixed XPath fails on default namespaces. Register a prefix in your tool (e.g. cfg:) and write //cfg:environment. XPath Studio lets you declare namespace bindings before running queries.

XPath vs CSS selectors vs JSONPath

JSONPath addresses JSON; XPath addresses XML. If you need JSON, convert with XML to JSON first — but namespace and attribute semantics may shift, so prefer native XPath on XML sources when possible.

Debugging failed queries

  1. Confirm the document is well-formed (Validate XML)
  2. Start broad (//*) then narrow
  3. Check default namespaces — the #1 cause of “empty result”
  4. Quote attribute values with single quotes inside double-quoted strings

Try it locally

Open XPath Studio, paste your config (or the sample above), enter an expression, and inspect the result list. Processing stays in your browser — suitable for internal configs you cannot upload to cloud XPath testers.

XPath axes in plain language

XPath navigates the tree using axes. You already use these implicitly:

  • /config/environment — child axis: direct children of config
  • //database — descendant axis: database anywhere below root
  • ./@host — attribute axis from current node (often inside predicates)
  • parent::* — parent of current node (less common in config queries)

Start paths with / from the document root; use .// for descendants of the current context node when XPath runs inside XSLT templates.

More predicate patterns

//environment[@name='production']/database/@host
//environment[position()=last()]
//database[@port > 1024 and @port < 65536]
//feature[contains(@flags, 'beta') and contains(@flags, 'checkout')]
//environment[count(database) > 1]

position() and last() help when multiple siblings share a tag name. Combine predicates with and / or for precise filters without custom code.

Real-world: Maven pom.xml snippet

Java projects still rely heavily on XML. Example queries:

<project>
  <groupId>com.example</groupId>
  <artifactId>payments</artifactId>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>6.1.0</version>
    </dependency>
  </dependencies>
</project>
  • /project/artifactId/text() → payments
  • //dependency[artifactId='spring-core']/version/text() → 6.1.0
  • count(//dependency) → number of dependencies

Paste a sanitized pom.xml into XPath Studio to audit versions or locate duplicate coordinates without writing a one-off script.

Namespaces in practice

Spring, SOAP, and industry schemas declare default namespaces. Unprefixed paths return nothing. Register bindings in XPath Studio — e.g. prefix m → http://maven.apache.org/POM/4.0.0 — then query //m:dependency/m:artifactId. View the root element’s xmlns attributes to find URIs.

XPath in tests and CI

Build scripts sometimes assert XML output with XPath (e.g. “response contains exactly one <status>ok</status>”). Prototype expressions interactively in the browser, then paste the verified path into your test suite. Validate documents first with Validate XML so parse errors do not masquerade as empty XPath results.

FAQ

XPath 1.0 vs 2.0?

Browser and most legacy config tools implement XPath 1.0. This guide covers 1.0 syntax. XPath 2.0+ adds stronger typing and FLWOR expressions — check your runtime if you embed XPath in Saxon or modern processors.

Why does //database/@host return multiple values?

You have multiple database elements (staging and production). Narrow with //environment[@name='production']/database/@host.

Can XPath modify XML?

XPath selects nodes; it does not edit. Use XSLT (XSLT Playground) or application code to transform documents after querying.

Related tools

  • XPath Studio
  • XML Editor Pro
  • XML well-formedness & XSD
← Safe local editing All guides Next: XML validation →
Home Privacy Terms About Guides For IT Contact Anita Kumawat · Tvishi Tech Services · webtoolkit.in