Sign in Join
Wiki copytemporary

xmlconf/ru

English · Русский

Модуль XMLConf предоставляет компонент TXMLConfig. Он использует объект TXMLDocument для чтения и записи XML-файла, но происходит непосредственно от TComponent.

Отказ от ответственности

Эта документация не является официальной, она основана на обычном процессе 1) изучения исходного кода; 2) экспериментирования; 3) размышлений: «Интересно, это ли имел в виду автор?»

Свойства и процедуры

property Filename
pascal
property Filename: String (published)

Имя XML-файла. Установка другого имени файла:

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

property StartEmpty
pascal
property StartEmpty: Boolean (published)

Определяет, читается ли существующий xmlfile из Filename.

property RootName
pascal
property RootName: DOMString (published)

Имя root элемента в файле. Должно соответствовать значению в файле при чтении существующего файла.

procedure Flush
pascal
procedure Flush (public)

Записывает файл xml - если задано имя файла.

procedure Clear
pascal
procedure Clear (public)

Воссоздает xmldocument как пустой документ.

constructor Create
pascal
constructor Create(AOwner: TComponent) (public)
destructor Destroy
pascal
destructor Destroy (public)

Работа с ключами и путями

XMLConfig поддерживает «стек» путей (как массив широких строк). Общий путь к элементу может быть <rootName>/key1/key2/key3/key4/value="some_value".

Это будет выглядеть в файле в виде

xml
<CONFIG>
  <key1>
    <key2>
      <key3>
        <key4 value="some_value"/>
      </key3>
    </key2>
  </key1>
</CONFIG>

(пренебрегая любыми другими элементами). Однако стек путей может содержать пути, а не только узлы, поэтому он может состоять как из четырех элементов глубиной key1;key2; key3;key4, так и точно так же только двух элементов key1/key2;key3/key4, или трех элементов key1;key2/key3;key4.

Кроме того, при чтении или установке значения можно указать полный путь, так что можно полностью игнорировать «стек» пути и указать полный путь (после RootName) для каждого значения. У каждого значения есть эффективный путь, а стек путей - это просто удобный способ добраться до конкретного эффективного пути.

procedure OpenKey
pascal
procedure OpenKey(const aPath: WideString) (public)

"Помещает" aPath в стек. Если текущий путь был <RootName>/key1 и aPath = key2/key3, после вызова OpenKey текущий путь будет <RootName>/key1/key2/key3.

procedure CloseKey
pascal
procedure CloseKey (public)

"Выталкивает" верхний путь из стека. Обратите внимание, что это последний введенный путь, а НЕ верхний(предыдущий) элемент. Таким образом, после приведенного выше примера OpenKey, за которым следует вызов CloseKey, стек возвращается к <RootName>/key1, а не <RootName>/key1/key2.

procedure ResetKey
pascal
procedure ResetKey (public)

Полностью очищает стек. Эффективный путь возвращается к <RootName>

Получение, установка и удаление значений

Все значения фактически читаются и записываются как строки, а другие перегруженные типы предоставляют определенные переводы 'AsString'.

function GetValue: WideString / procedure SetValue(const APath: WideString; const AValue: WideString)
pascal
function  GetValue(const APath: WideString; const ADefault: WideString): WideString (public)
pascal
procedure SetValue(const APath: WideString; const AValue: WideString) (public)

Устанавливает или получает строковое значение из RootName / Текущий_путь_из_стэка / APath. Путь создается, если он не существует в сеттере, и ADefault возвращается, если путь не существует в геттере.

function GetValue: Integer / procedure SetValue(const APath: WideString; AValue: Integer)
pascal
function GetValue(const APath: WideString; ADefault: Integer): Integer; (public)
pascal
procedure SetValue(const APath: WideString; AValue: Integer); (public)

Целочисленные значения преобразуются в/из строк с помощью функций IntToStr и strToIntDef.

function GetValue: Boolean / procedure SetValue(const APath: WideString; AValue: Boolean)
pascal
function  GetValue(const APath: WideString; ADefault: Boolean): Boolean; (public)
pascal
procedure SetValue(const APath: WideString; AValue: Boolean); (public)

Логические значения сохраняются как "True" или "False".

Warning: некоторые другие компоненты FCL/LCL XML (например, производные от TCustomPropertyStorage, такие как TXMLPropStorage) хранят логические значения с использованием целочисленных значений, несмотря на использование XMLConifg в качестве компонента хранения. Это, конечно, проблема только в том случае, если вы используете одни и те же файлы из обоих компонентов или переключаетесь с одного на другой во время разработки, как это сделал я

.

procedure SetDeleteValue(const APath: WideString; const AValue, DefValue: WideString) / procedure SetDeleteValue(const APath: WideString; AValue, DefValue: Integer) / procedure SetDeleteValue(const APath: WideString; AValue, DefValue: Boolean)
pascal
procedure SetDeleteValue(const APath: WideString; const AValue, DefValue: WideString); (public)
pascal
procedure SetDeleteValue(const APath: WideString; AValue, DefValue: Integer); (public)
pascal
procedure SetDeleteValue(const APath: WideString; AValue, DefValue: Boolean); (public)

Если AValue = DefValue, элемент удаляется. В противном случае устанавливается значение AValue.

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

procedure DeletePath(const APath: WideString)
pascal
procedure DeletePath(const APath: WideString); (public)

Удаляет все за пределами пути APath

procedure DeleteValue(const APath: WideString)
pascal
procedure DeleteValue(const APath: WideString); (public)

Удаляет значение, указанное APath. Если APath не указывает значение, он ничего не делает

property Modified: Boolean read FModified
pascal
property Modified: Boolean read FModified; (public)

Позволяет узнать, был ли изменен xmldocument и, следовательно, необходимо ли его очистить.

Однако процедура Flush ничего не делает, если документ не изменен, поэтому в любом случае проще просто вызвать процедуру Flush.

Пример

Следующая последовательность инструкций:

pascal
  XmlConfig1.Filename := FILE_NAME ;        // читаем файл, если он уже существует, но ...
  XmlConfig1.Clear ;                        // если файл уже существует, то очищаем данные, потому что хотим начать с нуля
  XmlConfig1.SetValue ('L1/L2/L3', '333') ; // добавляем немного данных
  XmlConfig1.SetValue ('L1/L2/L4', '44') ;
  XmlConfig1.SetValue ('L1/L2/L3', '33') ;  // это перезапишет предыдущее значение
  XmlConfig1.OpenKey  ('L1/L2') ;           // с этого момента все ключи будут относиться к L1/L2
  XmlConfig1.SetValue ('Lm', 'mm') ;        // они будут добавлены в L1/L2
  XmlConfig1.SetValue ('Lm/Ln', 'nn') ;
  XmlConfig1.SetValue ('/Lx/Ly', 'yy') ;    // и из-за начального символа '/' оно будет добавлено в root
  XmlConfig1.CloseKey ;
  XmlConfig1.SetValue ('L6/L7', '77') ;     // L6 будет удален
  XmlConfig1.SetValue ('L9', '99') ;
  XmlConfig1.SetValue ('L9/L99', '9999') ;  // Предыдущее L9 было атрибутом, теперь оно будет узлом
  XmlConfig1.DeletePath ('L6') ;
  XmlConfig1.Flush ;

даст такой XML:

xml
  <?xml version="1.0" encoding="utf-8"?>
  <CONFIG L9="99">
    <L1>
      <L2 L3="33" L4="44" Lm="mm">
        <Lm Ln="nn"/>
      </L2>
    </L1>
    <Lx Ly="yy"/>
    <L9 L99="9999"/>
  </CONFIG>

Обратите внимание, что последний элемент в параметре aPath для SetValue на самом деле является атрибутом: XmlConfig1.SetValue ('L1/L2/L3', '333') фактически задает атрибут L3 для элемента L1/L2.


См.также


From the Free Pascal wiki, page "xmlconf/ru", as it stood on 2022-01-02 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Edited on wiki.freepascal.org by 2 people, 2021–2022

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
ZoltanleoCreated page
Zoltanleo
ZoltanleoDisclaimer
ZoltanleoConfiguration
ZoltanleoExample
ZoltanleoСвойства и процедуры
ZoltanleoWorking with keys and paths
ZoltanleoExample
ZoltanleoРабота с ключами и путями
ZoltanleoСвойства и процедуры
Zoltanleoprocedure OpenKey(const aPath: WideString) (public)
ZoltanleoРабота с ключами и путями
Zoltanleoprocedure OpenKey
Zoltanleoprocedure OpenKey
Zoltanleoprocedure CloseKey
ZoltanleoSetting, Getting and Deleting Values
ZoltanleoЗапись, получение и удаление значений
Zoltanleoproperty Modified: Boolean read FModified
ZoltanleoExample
ZoltanleoSee also
FTurtleDeleted English categories.

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.