Index: trunk/src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java	(revision 18953)
+++ trunk/src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java	(revision 18954)
@@ -6,10 +6,4 @@
 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;
@@ -21,5 +15,4 @@
 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;
@@ -39,43 +32,32 @@
             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;
+
+            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);
+                }
             }
 
-            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 (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: trunk/src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java	(revision 18953)
+++ trunk/src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java	(revision 18954)
@@ -7,10 +7,4 @@
 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;
@@ -19,5 +13,4 @@
 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;
 
@@ -34,24 +27,14 @@
             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: trunk/src/org/openstreetmap/josm/io/session/NoteSessionImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/NoteSessionImporter.java	(revision 18953)
+++ trunk/src/org/openstreetmap/josm/io/session/NoteSessionImporter.java	(revision 18954)
@@ -7,10 +7,4 @@
 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;
@@ -19,5 +13,4 @@
 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;
@@ -35,18 +28,11 @@
             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: trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(revision 18953)
+++ trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(revision 18954)
@@ -23,5 +23,8 @@
 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;
 
 /**
@@ -30,4 +33,6 @@
  */
 public class OsmDataSessionImporter implements SessionLayerImporter {
+
+    private static Attr x2;
 
     @Override
@@ -68,4 +73,11 @@
     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();
