Как использовать пространство имен в выражении XPath в таблице ISXmlLocator? - PullRequest
0 голосов
/ 15 ноября 2010

Я использую XML System Search и XML File Changes в проекте InstallShield. В предыдущей установке пользователь выбирал имя хоста и порт для сервера. Когда пользователь установит снова, было бы идеально, если бы отображались предыдущие настройки. Идея состоит в том, чтобы прочитать значения из файла XML, если он существует, с помощью функции поиска системы XML.

Я могу заставить это работать, учитывая, что XML не содержит никакой информации о пространстве имен. Вот пример XML без пространства имен:

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationSettings ProductVersion="2.4.0.0001" Version="1">
    <Source Mechanism="Server">
        <Server Host="127.0.0.1" Port="11111"></Server>
    </Source>    
</ApplicationSettings>

XPath-запрос, который я использую для доступа к элементу Server:

/ApplicationSettings/Source/Server

Если я добавлю некоторую информацию о пространстве имен, поиск в системе XML не будет работать.

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationSettings ProductVersion="2.4.0.0001" Version="1" xmlns="http://127.0.0.1/schema/ApplicationSetting.xsd">
    <Source Mechanism="Server">
        <Server Host="127.0.0.1" Port="11111"></Server>
    </Source>    
</ApplicationSettings>

Я также пробовал следующее выражение XPath:

/*[local-name() = 'ApplicationSettings' and *[local-name() = 'Source' and *[local-name() = 'Server']]]

Это не работает, и в журнале кажется, что он находит элемент, но не атрибут:

MSI (c) (84:C8) [10:47:17:836]: Invoking remote custom action. DLL: C:\Users\CZIETS~1\AppData\Local\Temp\MSIFF9E.tmp, Entrypoint: ISXmlAppSearch
InstallShield 10:47:17: Searching for an XML Attribute value using the Element '/*[local-name() = 'ApplicationSettings' and *[local-name() = 'Source' and *[local-name() = 'Server']]]' and the Attribute 'Host'.
InstallShield 10:47:17: Attribute 'Host' not found using the following Element: '/*[local-name() = 'ApplicationSettings' and *[local-name() = 'Source' and *[local-name() = 'Server']]]'. Check for the existence of the Attribute.
InstallShield 10:47:17: Searching for an XML Attribute value using the Element '/*[local-name() = 'ApplicationSettings' and *[local-name() = 'Source' and *[local-name() = 'Server']]]' and the Attribute 'Port'.
InstallShield 10:47:17: Attribute 'Port' not found using the following Element: '/*[local-name() = 'ApplicationSettings' and *[local-name() = 'Source' and *[local-name() = 'Server']]]'. Check for the existence of the Attribute.
Action ended 10:47:17: ISXmlAppSearch. Return value 1.

Есть идеи?

1 Ответ

2 голосов
/ 15 ноября 2010

К сожалению, вы правы в том, что встроенный системный поиск XML не поддерживает пространства имен. Однако я запутался в вашем XPath. Разве поиск по пространству имен не должен отражать иерархию элементов? Я думаю, что в лучшем случае вы могли бы найти элемент ApplicationsSettings, у которого есть дочерний Source с дочерним сервером, но вместо элемента Server используется элемент ApplicationSettings. Если это работает вообще.

Я бы предложил изменить:

/ApplicationSettings/Source/Server

вместо этого (не проверено):

/*[local-name() = 'ApplicationSettings']/*[local-name() = 'Source']/*[local-name() = 'Server']
...