从项目目录而不是原始目录应用的相对文件路径

Posted

技术标签:

【中文标题】从项目目录而不是原始目录应用的相对文件路径【英文标题】:Relative file path being applied from project directory instead of original directory 【发布时间】:2012-08-18 06:43:39 【问题描述】:

我的程序从不是项目根目录的位置读取文档。该文档包含一个相对路径。当程序应用该路径时,它确实从项目的根目录开始。如何让它应用文档原始位置的路径?

这里是详细信息。有点长,但很简单。

我在 Eclipse 中有一个 Java 项目,位于

C:\one\two\three\four\five

程序运行一个 XSL 转换,它将 Schematron 模式作为输入,并生成一个新的 XSLT 样式表作为输出。架构位于

C:\one\two\three\four\five\six\S\P\schema.sch

它包含这一行,还有几个类似的:

<sch:let name="foo" select="document('../../C/P/bar.xml')"/>

如果您从架构的位置开始并应用该相对路径,您最终会得到

C:\one\two\three\four\five\six\C\P\bar.xml

这是bar.xml 的正确位置。然而,当我运行我的程序时,我得到了一些错误,这些错误似乎都与这个相似或相关:

Recoverable error on line 1262
  FODC0002: I/O error reported by XML parser processing
  file:/C:/one/two/three/C/P/bar.xml:
  C:\one\two\three\C\P\bar.xml (The system cannot find the path specified)

FODC0002 是“检索资源时出错”的错误代码。这是有道理的,因为这不是bar.xml 的正确位置。似乎相对路径正在应用于项目的根目录。这是相关代码:

void compileToXslt(byte[] schema) throws Exception 
    XsltCompiler comp = Runtime.getSaxonProcessor().newXsltCompiler();
    comp.setURIResolver(resolver);
    Source source = resolver.resolve("iso_svrl_for_xslt2.xsl", null);
    XsltExecutable executable = comp.compile(source);

    XsltTransformer transformer = executable.load();
    transformer.setSource(new StreamSource(new ByteArrayInputStream(schema)));
    Serializer serializer = new Serializer();
    serializer.setOutputStream(new ByteArrayOutputStream());
    transformer.setDestination(serializer);
    transformer.transform(); // Errors appear in logs during this line

    // ...

Sourcejavax.xml.transform.Source。 XSL 相关的类都来自 SAXON (Javadoc)。

我能做些什么来解决这个问题?将bar.xml 移动到程序正在寻找它的位置,然后编辑style.xsl,对我来说不是选项,因为这两个文件都属于第三方库。

更新: 进一步的研究让我相信我需要set the system ID of the StreamSource。我尝试用这个替换 transformer.setSource(... 行:

StreamSource strSrc = new StreamSource(new ByteArrayInputStream(schema));
strSrc.setSystemId(new
  File("C:\\one\\two\\three\\four\\five\\six\\S\\P\\schema.sch").toURI()
  .toURL().toExternalForm());
transformer.setSource(strSrc);

但我得到了相同的结果。我是否错误地使用了setSystemId()?我是不是完全走错了路?

【问题讨论】:

【参考方案1】:

我没有安装 java,但我假设您需要更改解析器,以找到您正在寻找的路径。

你没有展示你是如何得到它的。当然,您可以做的又快又脏,只需在参数选项卡下的调试配置中更改工作目录。但我假设你不想这样做

【讨论】:

以上是关于从项目目录而不是原始目录应用的相对文件路径的主要内容,如果未能解决你的问题,请参考以下文章

Jsp--绝对路径,相对路径笔记

delphi项目程序输出编译成应用程序文件

在 .css 文件中引用应用程序相对虚拟路径

17-Ubuntu-文件和目录命令-切换目录-相对路径和绝对路径

java 查找文件目录

python3绝对路径,相对路径