Как вставить пролог XML, используя SimpleStorage для создания файла GPX? - PullRequest
3 голосов
/ 30 ноября 2011

Я планирую принять раз и навсегда удобный инструмент для создания файлов gpx.

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

Вот (неполный) фрагмент для генерации файла gpx голой кости таким образом:

function CreateGpx: ISimpleStorage;
const
  versionStr = '1.1';
  creatorStr = 'MyGpxCreatorSSway';

  xmlnsStr = 'http://www.topografix.com/GPX/1/1';
  xmlns_xsiStr = 'http://www.w3.org/2001/XMLSchema-instance';
  xsiStr: string =  xmlnsStr+' '+
                    xmlnsStr+'/gpx.xsd';

begin
  Result := CreateStorage('gpx');

  CreateBuilder(Result).Construct(
  [
    AddAttr('xmlns',xmlnsStr),
    AddAttr('version',versionStr),
    AddAttr('creator',creatorStr),
    AddAttr('xmlns:xsi',xmlns_xsiStr),
    AddAttr('xsi:schemaLocation',xsiStr),
    //
    AddElement('metadata',
    [
      AddElement('bounds',
      [
        AddAttr('minlat','90.00000000'),
        AddAttr('minlon','180.00000000'),
        AddAttr('maxlat','-90.00000000'),
        AddAttr('maxlon','-180.00000000')
      ]),
      AddElement('extensions',[])
    ]),
    AddElement('extensions',[])
  ]
  );
end;

Пожалуйста, помогите мне!

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Я заметил соответствующий пост из Миха Ремек на OmniXML сайте.

Один из возможных ответов на мой вопрос сводится к следующему:

with OwnerDocument(Result.XMLNode) do
begin
  InsertBefore(CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"'), DocumentElement)
end;

для добавления сразу после строки инструкции:

  Result := CreateStorage('gpx'); 
0 голосов
/ 02 октября 2015
uses
  OmniXML,
  OmniXMLUtils;

function CreateGpx: ISimpleStorage;
{ ... }
var
  xmlDocument: IXMLDocument;
  xmlProcessingInstruction: IXMLProcessingInstruction;
  fisrtChild: IXMLNode;
begin
  { ... }
  xmlDocument := OmniXMLUtils.OwnerDocument(Result.Node.ParentNode);
  if OmniXMLUtils.FindProcessingInstruction(xmlDocument) = nil then
  begin
    xmlProcessingInstruction := xmlDocument.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"');

    fisrtChild := xmlDocument.FirstChild;
    if fisrtChild = nil then
    begin
      xmlDocument.AppendChild(xmlProcessingInstruction);
    end
    else
    begin
      xmlDocument.InsertBefore(xmlProcessingInstruction, fisrtChild);
    end;
  end;
  { ... }
end;
...