2015-06-21 5 views
0

У меня есть XmlTextReader для чтения серии XML-файлов для загрузки некоторой информации в мою программу.Как объединить два пути?

Однако в некоторых файлах XML у меня есть имя файла изображения, и я хочу загрузить это изображение.

Но проблема в том, что файл XML не имеет полного пути к изображению.

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

Это означает, что изображение существует там, где находится XML-файл.

По какой-то причине единственным способом получить путь к файлу XML является получение пути XmlTextReader, считывающего текущий файл XML.

Я сделал некоторые исследования, и я узнал, что вы можете получить путь XML из XmlTextReader, как показано ниже:

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.

Как я могу получить путь к файлу изображения?

ответ

1

У вас возникли две разные проблемы, которые необходимо решить отдельно.

В зависимости от API, используемого для использования файла изображения, путь URI file:// может поддерживаться или не поддерживаться. Так что вы хотите сделать, что локальный путь, как описано в 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 

Или, в «одном» line:

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

спасибо за объяснение. 'GetDirectoryName' выполнил эту работу, но для избавления от файла: // 'Я использовал' Substring (6) '. не довольно, но просто, –

+2

Этот код не только« не очень », он _will_ также прерывается в один прекрасный день. – CodeCaster

+0

спасибо. однолинейное решение.' new Uri (Path.Combine (Path.GetDirectoryName (reader.BaseURI), ImagePath)). LocalPath'. Теперь он не будет прерывать какой-либо день! –

1
Path.Combine(Path.DirectoryName(reader.BaseUri), imagePath) 
+0

Как примечание, если вы хотите, чтобы избавиться от «файл: //» схема из URI смотреть на класс Uri и свойство AbsolutePath. –

+0

Я исправил его с помощью 'Path.Combine (Path.GetDirectoryName (reader.BaseURI), imagePath) .Substring (6)' from 'file: //' всегда такая же длина. спасибо –

+2

Я бы настоятельно рекомендовал использовать фреймворк-методы для удаления схемы. Подстрока (6) не очевидна и может сломаться. (по крайней мере, удалить схему из BaseUri, поскольку это могло бы создать недопустимые пути, если бы корневой или абсолютный путь был когда-либо предоставлен в imagePath. –

0

Поскольку вы имеете дело с разрешением URL-адресов, я бы предложил использовать XmlUrlResolver в System.Xml:

string localPath = new XmlUrlResolver().ResolveUri(new Uri(baseUri), imageName).LocalPath; 
Смежные вопросы