Squeak.ru - шаблоны программирования

Как совместить два пути?

У меня есть 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 is "file:///D:/.../currentXml.xml"
  • imagePath is "Image.bmp".
  • Наконец, FullImagePath после присвоения результата Path.Combine будет file:///D:/.../currentXml.xml\\Image.bmp, чего я не ожидал.

Ожидаемый путь к изображению: D:/.../Image.bmp, в том же каталоге, что и currentXml.xml.

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

21.06.2015

Ответы:


1

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

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

Один из способов сделать это - получить каталог, в котором находится файл, см. Получение имя папки из пути:

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);
21.06.2015
  • спасибо за объяснение. GetDirectoryName выполнил свою работу. но чтобы избавиться от file://, я использовал Substring(6). не красиво, но просто, 21.06.2015
  • Этот код не только некрасивый, он тоже когда-нибудь сломается. 21.06.2015
  • благодаря. принятый. однострочное решение. new Uri(Path.Combine(Path.GetDirectoryName(reader.BaseURI), ImagePath)).LocalPath. теперь это не сломается когда-нибудь! 21.06.2015
  • @ M.kazemAkhgary MSDN упоминает, что Path.GetDirectoryName() не поддерживает пути с использованием file:, поэтому я сомневаюсь, что это сработает. Изменить: похоже, работает ... 21.06.2015
  • Кажется, что это работает, но не поддерживается, поэтому может измениться при работе в любой версии .NET. Правильный oneliner, который вы, кажется, предпочитаете, это string imagePath = Path.Combine(Path.GetDirectoryName(new Uri(reader.BaseURI).LocalPath), ImagePath);. 21.06.2015

  • 2

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

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

    3
  • Обратите внимание: если вы хотите избавиться от схемы file: // из URI, посмотрите на класс Uri и свойство AbsolutePath. 21.06.2015
  • Я исправил это, используя Path.Combine(Path.GetDirectoryName(reader.BaseURI), imagePath).Substring(6), поскольку file:// всегда имеет одинаковую длину. Благодарность 21.06.2015
  • Я настоятельно рекомендую использовать методы фреймворка для удаления схемы. .Substring (6) неочевиден и может сломаться. (по крайней мере удалите схему из BaseUri, так как это может создать недопустимые пути, если корневой или абсолютный путь когда-либо был указан в imagePath. 21.06.2015
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...