当前位置: 首页 > 知识库问答 >
问题:

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

柳联
2023-03-14

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

以下是细节。有点长,但很简单。

我在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

这是条的正确位置。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是“检索资源时出错”的错误代码这是有道理的,因为这不是条的正确位置。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。使改变来源。XSL相关的类都来自SAXON(Javadoc)。

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

更新:
进一步的研究让我相信我需要设置StreamSource系统ID。我试着用这个替换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个答案

黄成荫
2023-03-14

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

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

 类似资料:
  • 在我的Spring Boot配置文件中,我是否可以指定相对于Spring Boot jar的日志文件位置,而不是相对于启动jar的目录? null 开始: 结果: /random/dir/logs/app.log 期望: /app/dir/logs/app.log 附加信息:jar将运行在不同的操作系统上。因此jar路径可能类似于: null 完整解决方案:基于@Satyesht 开始:

  • 我正在建立一个开发博客来存储和引用我为我的投资组合编写的项目,我一直在尝试向我的帖子文本框添加媒体上传功能。我首先使用了一个标准的RichTextField,它有一个内置的功能,可以通过URL添加图像(无需上传)。它工作得很好,但我希望能够从我的机器上传照片。 博客是完全可操作的(在本地服务器上进行开发),所以所有不相关的代码都被忽略了。 唯一的问题是设置我的图像文件的路径。 models.py

  • 我想从现有目录中创建一个树,以便它显示其中的所有子文件夹和文件。我使用以下代码: <代码>文件文件=新文件(路径);TreeModel model=新文件TreeModel(文件);JTree tree=新JTree(模型)

  • 问题内容: 到现在为止,我们可以使用以下代码片段获取文件的绝对路径,以便稍后作为readStream打开: 从流星0.6.5开始,基本路径指向 还有Assets API,但该API不能给我们返回路径,而只能返回读取的文档。但是我们需要一个流来处理一些更大的数据文件吗? 问题答案: 从1.3版开始,已记录的功能 似乎是可靠地获得项目路径的最佳方法。 流星Github

  • 问题内容: 我可以使用SWT 选择文件夹而不是文件吗? 问题答案: 您可以使用代替。这是一些示例代码: 这是一个稍大的示例。

  • 我有这个方法来获取Java程序运行的目录。 但是,当我创建一个新的实例并将此目录作为其父目录时,它会在驱动器的根目录中返回一个。 我期望这个文件的绝对路径是,但它的。