【问题标题】:How to Combine Two paths?如何组合两条路径?
【发布时间】:2015-09-07 02:10:03
【问题描述】:

我有一个 XmlTextReader 来读取一系列 XML 文件以将一些信息加载到我的程序中。

但是,在某些 XML 文件中,我有图像的文件名,我想加载该图像。

但问题是 XML 文件没有图像的完整路径。

<Image id="ImageId" File="Image.bmp" /> 
<!-- full path is not available. Image is behind XML-->

这意味着图像存在于 xml 文件所在的位置。

由于某种原因,获取 XML 文件路径的唯一方法是获取读取当前 XML 文件的 XmlTextReader 的路径。

我做了一些研究,发现您可以从 XmlTextReader 中检索 XML 路径,如下所示:

string path = reader.BaseURI; // this will get the path of reading XML
                              // reader is XmlTextReader

如何将path 与图像的路径结合起来?

我尝试了以下方法:

string FullImagePath = Path.Combine(reader.BaseURI, imagePath);

这些是变量的值:

  • reader.BaseURI"file:///D:/.../currentXml.xml"
  • imagePath"Image.bmp"
  • 最后FullImagePath,分配Path.Combine的结果是file:///D:/.../currentXml.xml\\Image.bmp,这不是我所期望的。

图片的预期路径为:D:/.../Image.bmp,与currentXml.xml在同一目录下。

那么如何获取图片文件的路径呢?

【问题讨论】:

    标签: c# xml path filenames


    【解决方案1】:

    您有两个不同的问题需要分别解决。

    根据用于使用图像文件的 API,file:// URI 路径可能受支持,也可能不支持。因此,您希望将其设为本地路径,如 Convert file path to a file URI? 中所述:

    string xmlPath = "file://C:/Temp/Foo.xml";
    var xmlUri = new Uri(xmlPath); // Throws if the path is not in a valid format.
    string xmlLocalPath = xmlUri.LocalPath; // C:\Temp\Foo.xml
    

    然后您要构建图像文件的路径,该文件与 XML 文件位于同一目录中。

    一种方法是获取文件所在的目录,请参阅Getting the folder name from a path

    string xmlDirectory = Path.GetDirectoryName(xmlLocalPath); // C:\Temp
    

    然后您可以添加图像的文件名:

    string imagePath = Path.Combine(xmlDirectory, "image.png"); // C:\Temp\image.png
    

    或者,在“一个”行中:

    string imagePath = Path.Combine(Path.GetDirectoryName(new Uri(reader.BaseURI).LocalPath), 
                                    ImagePath);
    

    【讨论】:

    • 感谢您的解释。 GetDirectoryName 完成了这项工作。但是为了摆脱file://,我使用了Substring(6)。不漂亮但简单,
    • 该代码不仅“不漂亮”,它有一天也会中断。
    • 谢谢。公认。一条线解决方案。 new Uri(Path.Combine(Path.GetDirectoryName(reader.BaseURI), ImagePath)).LocalPath 。现在它总有一天不会坏的!
    • @M.kazemAkhgary MSDN mentions that Path.GetDirectoryName() "does not support paths using "file:",所以我怀疑这会起作用。编辑:它似乎工作......
    • 它似乎可以工作,但不受支持,因此可能会在任何 .NET 版本中更改工作。您似乎喜欢的正确“oneliner”是string imagePath = Path.Combine(Path.GetDirectoryName(new Uri(reader.BaseURI).LocalPath), ImagePath);
    【解决方案2】:
     Path.Combine(Path.DirectoryName(reader.BaseUri), imagePath)
    

    【讨论】:

    • 请注意,如果您想摆脱 URI 中的“file://”方案,请查看 Uri 类和 AbsolutePath 属性。
    • 我使用Path.Combine(Path.GetDirectoryName(reader.BaseURI), imagePath).Substring(6) 修复了它,因为file:// 的长度始终相同。谢谢
    • 我强烈建议使用框架方法来删除该方案。 .substring(6) 不明显,可能会损坏。 (至少从 BaseUri 中删除该方案,因为如果在 imagePath 中提供了根路径或绝对路径,这可能会创建无效路径。
    【解决方案3】:

    当您正在处理解析 URL 时,我建议在 System.Xml 中使用 XmlUrlResolver

    string localPath = new XmlUrlResolver().ResolveUri(new Uri(baseUri), imageName).LocalPath;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2010-10-31
      相关资源
      最近更新 更多