2012-07-27 5 views
4

xml 파일을 읽고 사용자가 입력을 변경할 수있는 가능성을 부여하여이 inno 스크립트를 사용하고 있습니다.Inno 스크립트에서 Xpath를 사용하여 xml 파일 읽기

function LoadValueFromXML(const AFileName, APath: string): string; 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    Result := ''; 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.load(AFileName); 
    if (XMLDocument.parseError.errorCode <> 0) then 
     MsgBox('The XML file could not be parsed. ' + 
     XMLDocument.parseError.reason, mbError, MB_OK) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(APath); 
     Result := XMLNode.text; 
    end; 
    except 
    MsgBox('An error occured!', mbError, MB_OK); 
    end; 
end; 

이 XML에서

EditMailServerID.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/Mail/MailServer/'); 
    EditMailServerUserId.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/Mail/UserName/'); 
    EditMailServerPassword.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/Mail/Password/'); 
    EditERPBOServicePath.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/default/ERPBOWebServicePath/'); 
    EditERPHOServicePath.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/default/ERPHOWebServicePath/'); 
    EditCustomerId.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', '//settings/license/customernumber/'); 

샘플 XML 코드를 값을로드하는 기능 이상으로 호출하는 코드입니다 : 여기

내가 사용하고있는 코드입니다

<?xml version="1.0" encoding="utf-8"?> 
<settings> 
    <default> 
    <ReadInvoiceFile>0</ReadInvoiceFile> 
    <HOUser> 
    </HOUser> 
    <HOShopNo>1</HOShopNo> 
    <LagerShop>500</LagerShop> 
    <SenderAddress>[email protected]</SenderAddress> 
    <HostId>192.168.6.155</HostId> 
    <PincodeDownloadFileName>tilbud5.txt</PincodeDownloadFileName> 
    <PrinterName /> 
    <UseAverageCostPrice>true</UseAverageCostPrice> 
    <ERPBOWebServicePath>http://localhost:90/FlisekompanietERPBOWebService/ERPBOService.asmx</ERPBOWebServicePath> 
    <ERPHOWebServicePath>http://localhost:90/FlisekompanietERPHOWebService/ERPHOService.asmx</ERPHOWebServicePath> 
    </default> 
    <license> 
    <customernumber>998877</customernumber> 
    <custid>532</custid> 
    </license> 
    <Mail> 
    <MailServer>dnserver.datanova.no</MailServer> 
    <UserName>sharma</UserName> 
    <Password>datanova123</Password> 
    </Mail> 
    <sms> 
    <provider>test</provider> 
    <sendername>test</sendername> 
    <username>test</username> 
    <password>test</password> 
    </sms> 
</settings> 

다음에서 런타임 오류가 발생합니다 :

XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(APath); 
+0

어떤 오류가 발생 했습니까? – Deanna

답변

4

함수를 호출 할 때 XPath 표현식 끝에 /이 추가로 있습니다. 그냥 제거하면 작동하게됩니다. 수정 사항은 다음과 같습니다.

EditMailServerID.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/Mail/MailServer'); 
EditMailServerUserId.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/Mail/UserName'); 
EditMailServerPassword.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/Mail/Password'); 
EditERPBOServicePath.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/default/ERPBOWebServicePath'); 
EditERPHOServicePath.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/default/ERPHOWebServicePath'); 
EditCustomerId.Text := LoadValueFromXML('C:\dnpr\ERPBO\Settings.xml', 
    '//settings/license/customernumber'); 
+1

물론 맞춤형 앱이나 파일이 다른 곳에 있지 않을 것이라는 것을 보장하지 않는 한, 파일 경로를 결코 하드 코딩해서는 안됩니다. – Miral