Index: src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java
===================================================================
--- src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java	(revision 18948)
+++ src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java	(working copy)
@@ -6,12 +6,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
 import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
 import org.openstreetmap.josm.gui.io.importexport.RtkLibImporter;
@@ -20,7 +14,6 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Utils;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -38,45 +31,34 @@
         if (!"0.1".equals(version)) {
             throw new IllegalDataException(tr("Version ''{0}'' of meta data for gpx track layer is not supported. Expected: 0.1", version));
         }
-        try {
-            XPathFactory xPathFactory = XPathFactory.newInstance();
-            XPath xpath = xPathFactory.newXPath();
-            XPathExpression fileExp = xpath.compile("file/text()");
-            String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING);
-            if (Utils.isEmpty(fileStr)) {
-                throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex()));
-            }
+        String fileStr = OsmDataSessionImporter.extractFileName(elem, support);
 
-            try (InputStream in = support.getInputStream(fileStr)) {
-                GpxImporter.GpxImporterData importData;
+        try (InputStream in = support.getInputStream(fileStr)) {
+            GpxImporter.GpxImporterData importData;
 
-                if (NMEAImporter.FILE_FILTER.acceptName(fileStr)) {
-                    importData = NMEAImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName());
-                } else if (RtkLibImporter.FILE_FILTER.acceptName(fileStr)) {
-                    importData = RtkLibImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName());
-                } else {
-                    importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
+            if (NMEAImporter.FILE_FILTER.acceptName(fileStr)) {
+                importData = NMEAImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName());
+            } else if (RtkLibImporter.FILE_FILTER.acceptName(fileStr)) {
+                importData = RtkLibImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName());
+            } else {
+                importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
+            }
+            if (importData.getGpxLayer() != null && importData.getGpxLayer().data != null) {
+                importData.getGpxLayer().data.fromSession = true;
+            }
+            NodeList markerNodes = elem.getElementsByTagName("markerLayer");
+            if (markerNodes.getLength() > 0 && markerNodes.item(0).getNodeType() == Node.ELEMENT_NODE) {
+                Element markerEl = (Element) markerNodes.item(0);
+                try {
+                    int index = Integer.parseInt(markerEl.getAttribute("index"));
+                    support.addSubLayer(index, importData.getMarkerLayer(), markerEl);
+                } catch (NumberFormatException ex) {
+                    Logging.warn(ex);
                 }
-                if (importData.getGpxLayer() != null && importData.getGpxLayer().data != null) {
-                    importData.getGpxLayer().data.fromSession = true;
-                }
-                NodeList markerNodes = elem.getElementsByTagName("markerLayer");
-                if (markerNodes.getLength() > 0 && markerNodes.item(0).getNodeType() == Node.ELEMENT_NODE) {
-                    Element markerEl = (Element) markerNodes.item(0);
-                    try {
-                        int index = Integer.parseInt(markerEl.getAttribute("index"));
-                        support.addSubLayer(index, importData.getMarkerLayer(), markerEl);
-                    } catch (NumberFormatException ex) {
-                        Logging.warn(ex);
-                    }
-                }
-
-                support.addPostLayersTask(importData.getPostLayerTask());
-                return getLayer(importData);
             }
 
-        } catch (XPathExpressionException e) {
-            throw new IllegalDataException(e);
+            support.addPostLayersTask(importData.getPostLayerTask());
+            return getLayer(importData);
         }
     }
 
Index: src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java
===================================================================
--- src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java	(revision 18948)
+++ src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java	(working copy)
@@ -6,12 +6,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
@@ -18,7 +12,6 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
-import org.openstreetmap.josm.tools.Utils;
 import org.w3c.dom.Element;
 
 /**
@@ -33,26 +26,16 @@
         if (!"0.1".equals(version)) {
             throw new IllegalDataException(tr("Version ''{0}'' of meta data for marker layer is not supported. Expected: 0.1", version));
         }
-        try {
-            XPathFactory xPathFactory = XPathFactory.newInstance();
-            XPath xpath = xPathFactory.newXPath();
-            XPathExpression fileExp = xpath.compile("file/text()");
-            String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING);
-            if (Utils.isEmpty(fileStr)) {
-                throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex()));
-            }
+        String fileStr = OsmDataSessionImporter.extractFileName(elem, support);
 
-            try (InputStream in = support.getInputStream(fileStr)) {
-                GpxImporter.GpxImporterData importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(),
-                        progressMonitor);
+        try (InputStream in = support.getInputStream(fileStr)) {
+            GpxImporter.GpxImporterData importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(),
+                    progressMonitor);
 
-                support.addPostLayersTask(importData.getPostLayerTask());
+            support.addPostLayersTask(importData.getPostLayerTask());
 
-                importData.getGpxLayer().destroy();
-                return importData.getMarkerLayer();
-            }
-        } catch (XPathExpressionException e) {
-            throw new IllegalDataException(e);
+            importData.getGpxLayer().destroy();
+            return importData.getMarkerLayer();
         }
     }
 }
Index: src/org/openstreetmap/josm/io/session/NoteSessionImporter.java
===================================================================
--- src/org/openstreetmap/josm/io/session/NoteSessionImporter.java	(revision 18948)
+++ src/org/openstreetmap/josm/io/session/NoteSessionImporter.java	(working copy)
@@ -6,12 +6,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
 import org.openstreetmap.josm.gui.io.importexport.NoteImporter;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.NoteLayer;
@@ -18,7 +12,6 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
-import org.openstreetmap.josm.tools.Utils;
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
@@ -34,20 +27,13 @@
         if (!"0.1".equals(version)) {
             throw new IllegalDataException(tr("Version ''{0}'' of meta data for note layer is not supported. Expected: 0.1", version));
         }
-        try {
-            XPathFactory xPathFactory = XPathFactory.newInstance();
-            XPath xpath = xPathFactory.newXPath();
-            XPathExpression fileExp = xpath.compile("file/text()");
-            String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING);
-            if (Utils.isEmpty(fileStr)) {
-                throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex()));
-            }
 
-            NoteImporter importer = new NoteImporter();
-            try (InputStream in = support.getInputStream(fileStr)) {
-                return importer.loadLayer(in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
-            }
-        } catch (XPathExpressionException | SAXException e) {
+        String fileStr = OsmDataSessionImporter.extractFileName(elem, support);
+
+        NoteImporter importer = new NoteImporter();
+        try (InputStream in = support.getInputStream(fileStr)) {
+            return importer.loadLayer(in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
+        } catch (SAXException e) {
             throw new IllegalDataException(e);
         }
     }
Index: src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java
===================================================================
--- src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(revision 18948)
+++ src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(working copy)
@@ -22,7 +22,10 @@
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
 import org.openstreetmap.josm.tools.Utils;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * Session importer for {@link OsmDataLayer}.
@@ -30,6 +33,8 @@
  */
 public class OsmDataSessionImporter implements SessionLayerImporter {
 
+    private static Attr x2;
+
     @Override
     public Layer load(Element elem, ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
         checkMetaVersion(elem);
@@ -67,6 +72,13 @@
      */
     public static String extractFileName(Element elem, ImportSupport support) throws IllegalDataException {
         try {
+            // see #23427: try first to avoid possibly very slow XPath call
+            NodeList x = elem.getElementsByTagName("file");
+            if (x.getLength() > 0 && x.item(0).getNodeType() == Node.ELEMENT_NODE) {
+                String fileStr = x.item(0).getTextContent();
+                if (!Utils.isEmpty(fileStr))
+                    return fileStr;
+            }
             XPathFactory xPathFactory = XPathFactory.newInstance();
             XPath xpath = xPathFactory.newXPath();
             XPathExpression fileExp = xpath.compile("file/text()");
