2017-02-21 3 views
0

Ich habe ein Problem mit der Analyse von XML. Ich schaffte es, in "TXMLDocument" zu bekommen, aber es funktioniert nicht auf Android.XML-Analyse in Android, IXMLDOMDocument

Wie erhalten Sie Feldwerte? Ich brauche 9240-221 ich den Wert erhalten müssen: „9240-221“

ich nicht in Google gefunden habe, wie es zu tun (auch nicht ein Handbuch auf, wie man arbeitet mit IXMLDOMDocument gefunden hat).

Code:

uses ComObj, MSXML; 


procedure TForm2.Button1Click(Sender: TObject); 
var 
    xml: IXMLDOMDocument; 
    node: IXMLDomNode; 
    nodes_row, nodes_se: IXMLDomNodeList; 
    i, j: Integer; 
    url: string; 
begin 

    // put url or file name 
    //url := 'https://reverse.geocoder.cit.api.here.com/6.2/reversegeocode.xml?prox=32.791288%2C-17.045887&mode=retrieveAddresses&maxresults=1&gen=8&app_id=ZHsaRDKOhKQKjKOba0cS&app_code=RPlNCmcST6RICWUMk2OzYQ'; 

    xml := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument; 
    xml.async := False; 
    //xml.load(url); // or use loadXML to load XML document using a supplied string 
    xml.loadXML 
    (
    '<ns2:Search xmlns:ns2="http://www.navteq.com/lbsp/Search-Search/4">'+ 
    '<Response>'+ 
    '<MetaInfo>...</MetaInfo>'+ 
    '<View xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SearchResultsViewType"> '+ 
    '<ViewId>0</ViewId>'+ 
    '<Result>'+ 
    '<Relevance>1.0</Relevance>'+ 
    '<Distance>-1996.0</Distance>'+ 
    '<Direction>358.6</Direction>'+ 
    '<MatchLevel>city</MatchLevel>'+ 
    '<MatchQuality>...</MatchQuality>'+ 
    '<Location>'+ 
    '<LocationId>NT_yT.xGXLRj-bHQLe8aMmP2A</LocationId>'+ 
    '<LocationType>area</LocationType>'+ 
    '<DisplayPosition>...</DisplayPosition>'+ 
    '<MapView>...</MapView>'+ 
    '<Address>'+ 
    '<Label>São Vicente, Portugal</Label>'+ 
    '<Country>PRT</Country>'+ 
    '<County>Ilha da Madeira</County>'+ 
    '<City>São Vicente</City>'+ 
    '<PostalCode>9240-221</PostalCode> '+ 
    '<AdditionalData key="CountryName">Portugal</AdditionalData>'+ 
    '<AdditionalData key="CountyName">Ilha da Madeira</AdditionalData>'+ 
    '</Address>'+ 
    '<MapReference>...</MapReference>'+ 
    '</Location> '+ 
    '</Result>'+ 
    '</View>'+ 
    '</Response>'+ 
    '</ns2:Search>' 
); 

    if xml.parseError.errorCode <> 0 then 
    raise Exception.Create('XML Load error:' + xml.parseError.reason); 


    nodes_row := xml.selectNodes('/ns2'); 
    for i := 0 to nodes_row.length - 1 do 
    begin 
    node := nodes_row.item[i]; 
    showmessage('phrase=' + node.selectSingleNode('ViewId').text); 
    nodes_se := node.selectNodes('.....'); 
    for j := 0 to nodes_se.length - 1 do 
    begin 
     node := nodes_se.item[j]; 
    end; 
    showmessage('--------------'); 
    end; 
end; 
+0

IXMLDOMDocument ist eine Schnittstelle eines Windows-XML-Parser Objekt (siehe https://msdn.microsoft.com/en-us/library/windows/desktop/dd892951(v=vs.85).aspx). Warum erwarten Sie, es auf Android zu verwenden? – MartynA

+0

In "Embarcadero RadStudio 10.1Berlin - Delphi" bekomme ich beim Kompilieren für Windows "PostalCode" mit "TXMLDocument", aber auf Android "X: = TXMLDocument.Create (self); In Laufzeit gibt es einen Fehler und Ich kann nicht den Wert erhalten. So versuche ich herauszufinden, eine andere Möglichkeit, um es zu bekommen. –

+0

@MartynA: OmniXML-Anbieter ist plattformübergreifend. – whosrdaddy

Antwort

0

Wenn Sie für XML-Dokumente Cross-Plattform-Unterstützung möchten, können Sie TXmlDocument mit dem Anbieter zu OmniXML gesetzt verwenden. Vom documentation (Hervorhebung von mir):

MSXML: Schnellster des eingebauten in RAD Studio XML-Anbieter. Nur Windows. Standardeinstellung. Bei der plattformübergreifenden Unterstützung müssen Sie einen anderen XML-Lieferanten auswählen. Wenn Sie keinen anderen XML-Anbieter angeben, verfügt Ihre Anwendung über keine XML-Unterstützung auf anderen Plattformen als Windows und Sie sehen eine Laufzeitausnahme, wenn Sie Ihre Anwendung auf anderen Plattformen ausführen.

OmniXML: Viel schneller als ADOM, aber etwas langsamer als MSXML. Cross-Plattform.

ADOM: Langsamer als die anderen integrierten RAD Studio XML-Anbieter. Cross-Plattform.

Hier ist ein vollständiges Beispiel für eine Lösung, die OmniXML verwendet und funktioniert auf allen Plattformen (Sie müssen mindestens Delphi XE7 für diese):

unit FrmMain; 

interface 

uses 
    Xml.Xmldom, 
    Xml.Omnixmldom, 
    Xml.Xmldoc, 
    Xml.Xmlintf, 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

function selectNode(xnRoot: IXmlNode; const nodePath: WideString): IXmlNode; 
var 
    intfSelect : IDomNodeSelect; 
    dnResult : IDomNode; 
    intfDocAccess : IXmlDocumentAccess; 
    doc: TXmlDocument; 
begin 
    Result := nil; 
    if not Assigned(xnRoot) or not Supports(xnRoot.DOMNode, IDomNodeSelect, intfSelect) then 
    Exit; 
    dnResult := intfSelect.selectNode(nodePath); 
    if Assigned(dnResult) then 
    begin 
    if Supports(xnRoot.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then 
     doc := intfDocAccess.DocumentObject 
    else 
     doc := nil; 
    Result := TXmlNode.Create(dnResult, nil, doc); 
    end; 
end; 

function XPathQuery(Doc : IXMLDocument; Query : String) : String; 

var 
Node : IXMLNode; 

begin 
Result := ''; 
Node := SelectNode(Doc.DocumentElement, Query); 
if Assigned(Node) then 
    Result := Node.Text 
end; 

procedure TForm1.Button1Click(Sender: TObject); 

var 
    Xml: IXMLDocument; 
    Str : String; 

begin 
DefaultDOMVendor := sOmniXmlVendor; 
Xml := TXMLDocument.Create(nil); 
Xml.LoadFromXML 
    (
    '<ns2:Search xmlns:ns2="http://www.navteq.com/lbsp/Search-Search/4">'+ 
    '<Response>'+ 
    '<MetaInfo>...</MetaInfo>'+ 
    '<View xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SearchResultsViewType"> '+ 
    '<ViewId>0</ViewId>'+ 
    '<Result>'+ 
    '<Relevance>1.0</Relevance>'+ 
    '<Distance>-1996.0</Distance>'+ 
    '<Direction>358.6</Direction>'+ 
    '<MatchLevel>city</MatchLevel>'+ 
    '<MatchQuality>...</MatchQuality>'+ 
    '<Location>'+ 
    '<LocationId>NT_yT.xGXLRj-bHQLe8aMmP2A</LocationId>'+ 
    '<LocationType>area</LocationType>'+ 
    '<DisplayPosition>...</DisplayPosition>'+ 
    '<MapView>...</MapView>'+ 
    '<Address>'+ 
    '<Label>São Vicente, Portugal</Label>'+ 
    '<Country>PRT</Country>'+ 
    '<County>Ilha da Madeira</County>'+ 
    '<City>São Vicente</City>'+ 
    '<PostalCode>9240-221</PostalCode> '+ 
    '<AdditionalData key="CountryName">Portugal</AdditionalData>'+ 
    '<AdditionalData key="CountyName">Ilha da Madeira</AdditionalData>'+ 
    '</Address>'+ 
    '<MapReference>...</MapReference>'+ 
    '</Location> '+ 
    '</Result>'+ 
    '</View>'+ 
    '</Response>'+ 
    '</ns2:Search>' 
); 
    Str := XPathQuery(Xml, '//PostalCode'); 
    ShowMessage(Str); 
end; 

end. 
+0

Ich definierte das TXMLDocument mit Ihnen sprach. Setzen Sie DOMVendor auf die Arbeit mit OmniXML. Xml: = TXMLDocument.Create (Null); Xml.DOMVendor: = GetDOMVendor ('Omni XML'); Es funktioniert gut, vielen Dank. Nochmals vielen Dank und Entschuldigung für die lange Verzögerung in der Antwort. –