Wix и XPath: как изменить номер версии с помощью util: XmlFile, если путь не уникален - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь изменить номера версий следующей сборки.

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
      </dependentAssembly>

Проблема в том, что я не знаю, как изменить значение в bindingRedirect, когда я устанавливаю Newtonsoft.Json как ElementPath,Также невозможно установить путь к bindingRedirect, поскольку другие сборки могут иметь одинаковый номер версии.

Спасибо.

РЕДАКТИРОВАТЬ:

Строка, как в комментарии @ Dialecticus будет работать.Я тестировал эту строку в Интернете: https://www.freeformatter.com/xpath-tester.html Но, к сожалению, она не работает с WiX.В документации я обнаружил, что квадратные скобки должны быть экранированы: https://wixtoolset.org/documentation/manual/v3/xsd/util/xmlconfig.html Мой XPath выглядит следующим образом:

//configuration/runtime/assemblyBinding/dependentAssembly[\[]assemblyIdentity/@name='Newtonsoft.Json'[\]]/bindingRedirect/@newVersion

Проблема здесь заключается в пространстве имен XML в assemblyBinding.Я удалил это для тестирования, и это работало.Кроме того, я начал путь с // depenAssembly , но снова я получаю сообщение об ошибке: Не удалось найти узел

1 Ответ

1 голос
/ 09 июля 2019

XPath определяет и предикат (фильтр), и цель. Для вас цель - newVersion атрибут узла bindingRedirect, а предикат - name="Newtonsoft.Json" узла assemblyIdentity. Комбинируя два, цель должна выглядеть примерно так:

/runtime/assemblyBinding/dependentAssembly[assemblyIdentity/@name='Newtonsoft.Json']/bindingRedirect/@newVersion

К сожалению, элемент XmlFile не поддерживает пространства имен. В GitHub есть открытый выпуск , но он старый и неактивный. Обходной путь описан в сообщении в списке рассылки wix:

Если у вас есть <foo><bar xmlns="http://example.com/"><quux/></bar></foo>, выражение XPath /foo/bar/quux не будет совпадать, потому что оно спрашивает для элементов без пространства имен, и bar и quux находятся в пространстве имен.

Кажется, WiX не поддерживает объявление префиксов пространства имен для использования в выражении XPath, так что вам придется использовать уродливый /foo/*[local-name() = 'bar']/*[local-name() = 'quux']. Или, если вы хочу убедиться, что это относится только к элементу в правом пространство имен, *[local-name() = 'foo' and namespace-uri() = 'http://example.com/']

...