2011-11-30 41 views
3

我打算一勞永逸地使用一個工具來處理創建gpx文件。如何使用SimpleStorage插入xml prolog來生成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; 

請幫幫我!

+0

問題是什麼? – Bascy

+1

@Bascy:另外說明的問題是「如何插入標題<?xml version =」1.0「encoding =」UTF-8「?>」「,默認情況下SimpleStorage不會插入它。 – menjaraz

回答

1

我發現有關postMiha RemecOmniXML網站。

一個可能的回答我的問題可能會被歸結爲如下:

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

在指令行之後追加:

Result := CreateStorage('gpx'); 
0
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;