Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   IXMLDomDocument vs. IXMLDocument (https://www.delphipraxis.net/198546-ixmldomdocument-vs-ixmldocument.html)

creehawk 12. Nov 2018 18:43

IXMLDomDocument vs. IXMLDocument
 
Moin Moin.

Ein Teil einer XSD:

Code:
  <xs:element name="Adressen">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Adresse" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="DataPattern_PersNr" name="PersNr"/>
              <xs:element type="DataPattern_Anrede" name="Anrede"/>
              <xs:element type="DataPattern_Titel" name="Titel"/>
              //...***...
              <xs:element type="DataPattern_BPANR" name="BPANR"/>
              <xs:element type="xs:base64Binary" name="Photo"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

Ich möchte die Attribute "type" und "name" auslesen in eine ListBox.

Mit IXMLDomDocument mache ich dies:
Code:
.....SelectSingleNode('//xs:element[@name="Adresse"]').childNodes.nextNode.childNodes.nextNode.childNodes;
Nicht elegant, funktioniert aber bestens.

Mit IXMLDocument mache ich ......das wie? Oder geht das nicht? Oder ganz anders?

creehawk

Sherlock 29. Apr 2020 09:45

AW: IXMLDomDocument vs. IXMLDocument
 
Schade, daß es hierzu keine Antwort gibt. Ich stehe vor einer ähnlichen Frage. Ich habe ein XML, daß ich leidlich gut mit IXMLDOMDocument durchsuchen kann, mit IXMLDocument ist das nicht so einfach... Aber IXMLDOMDocument ist nicht Plattformübergreifend, vermute ich mal ganz frech. Hat dieses Jahr jemand Muße zu antworten? :glaskugel:

Sherlock

Moombas 29. Apr 2020 09:54

AW: IXMLDomDocument vs. IXMLDocument
 
Kannst du nicht folgendes dafür nutzen: http://docwiki.embarcadero.com/Libra...f.IXMLNodeList

Sherlock 4. Mai 2020 10:20

AW: IXMLDomDocument vs. IXMLDocument
 
Ja, könnte ich wohl, aber es ist unglaublich holprig in der Anwendung. Es gibt zB kein SelectSingleNode. Von XMLDOM kommend fällt mir grad gar nicht ein, wie ich durch so einen Teilbaum manövriere, ohne mir die Ohren zu brechen:
Code:
 <OBX>
   <OBX.3>SpO2</OBX.3>
   <OBX.5>96</OBX.5>
   <OBX.6>%</OBX.6>
   <OBX.7>90-100</OBX.7>
   <OBX.14>20200416141051</OBX.14>
 </OBX>
 <OBX>
   <OBX.3>PR</OBX.3>
   <OBX.5>65</OBX.5>
   <OBX.6>BPM</OBX.6>
   <OBX.7>50-130</OBX.7>
   <OBX.14>20200416141051</OBX.14>
 </OBX>
Hätte nicht gedacht, daß Microsoft uns Entwickler so verwöhnt.

Sherlock

himitsu 4. Mai 2020 13:12

AW: IXMLDomDocument vs. IXMLDocument
 
Zitat:

Zitat von Sherlock (Beitrag 1463554)
Von XMLDOM kommend ...

XPath?

Sherlock 5. Mai 2020 10:18

AW: IXMLDomDocument vs. IXMLDocument
 
Ich glaube ich habe mich missverständlich ausgedrückt. Ich verwende derzeit IXMLDOMDocument und was so dazugehört. Ich möchte umstellen auf das plattformunabhängige IXMLDocument. Xpath ist wohl eher etwas was zu IXMLDOMDocument gehört? Zu einem XML mit allerlei für mich irrelevanten Tags außer allem was unter den mehrfachen <OBX> zu finden ist, hatte ich bisher eine Lösung nach diesem Schema (vereinfacht dargestellt):
Delphi-Quellcode:
function XML2Data(const RecvString: string): Boolean;
var
  myXML     : IXMLDOMDocument;
  myNodeList : IXMLDOMNodeList;
  myNode    : IXMLDOMNode;
  i         : Integer;
  myVitalSign: TVitalSign;
begin
  Result := False;
  CoInitialize(nil);
  myXML := CoDOMDocument.Create;
  try
    try
      myXML.Load(RecvString);
      myNodeList := myXML.getElementsByTagName('OBX');
      if myNodeList.length > 0 then
      begin
        myVitalSign := TVitalSign.Create;
        for i := 0 to myNodeList.length - 1 do
        begin
          myNode := myNodeList.Item[i];
          if myNode.hasChildNodes then
          begin
            if myNode.selectSingleNode('OBX.3').Text = 'SpO2' then
              myVitalSign.SPO2 := StrToIntDef(myNode.selectSingleNode('OBX.5').Text, 0)
            else if myNode.selectSingleNode('OBX.3').Text = 'PR' then
              myVitalSign.PR := StrToIntDef(myNode.selectSingleNode('OBX.5').Text, 0)
          end;
          Result := True;
        end;
      end;
    finally
      CoInitialize(nil);
    end;
  except
    Result := False;
  end;
end;
Jetzt möchte ich gerne plattformübergreifend werden. IXMLDocument und seine Nodes ist aber weitaus... unhandlicher als IXMLDOMDocument. Wie kann ich also eine Liste bestimmter Knoten analog zu getElementsByTagName finden und wie bekomme ich einen bestimmten Unterknoten analog zu selectSingleNode?

Sherlock

himitsu 5. Mai 2020 10:36

AW: IXMLDomDocument vs. IXMLDocument
 
Ja, XPath wird nicht von jeder XML-Library unterstützt, aber jede "Größere" sollte es schon können.

k.A. was IXMLDocument auf den jeweiligen Platformen intern verwendet,
aber ich würde schon davon ausgehen, dass auch das neue IXMLDocument es irgendwo können müsste.
https://de.wikipedia.org/wiki/XPath
MSXML kann es, OmniXML auch und selbst JavaScript kann es.

Sherlock 5. Mai 2020 14:59

AW: IXMLDomDocument vs. IXMLDocument
 
Sodele, danke für den Hinweis, Himitsu. Roberto Ruiz hat sich der Sache mal vor Jahren angenommen: https://theroadtodelphi.com/category/xpath/

Die Methoden selectNodes und selectSingleNode sehen vielversprechend aus, friemle sie in mein Programm und melde mich gleich wieder.

Sherlock

Sherlock 5. Mai 2020 16:41

AW: IXMLDomDocument vs. IXMLDocument
 
Ich hab die totale Blockade und stehe auf dem Schlauch. Erinnere mich gerade warum ich XML seit Jahren meide wie die Pest :-D

Wir erinnern uns, so sieht der für mich interessante Teil aus:
Code:
 <OBX>
   <OBX.3>SpO2</OBX.3>
   <OBX.5>96</OBX.5>
   <OBX.6>%</OBX.6>
   <OBX.7>90-100</OBX.7>
   <OBX.14>20200416141051</OBX.14>
 </OBX>
 <OBX>
   <OBX.3>PR</OBX.3>
   <OBX.5>65</OBX.5>
   <OBX.6>BPM</OBX.6>
   <OBX.7>50-130</OBX.7>
   <OBX.14>20200416141051</OBX.14>
 </OBX>
Ich bekomme jetzt mit dem selectNodeList von RRuiz beide OBX Knoten. Prima. Jetzt muss ich rein in jeden davon und ermitteln, welche der 30 möglichen Messgrößen (hatte ich bisher nicht erwähnt, aber jetzt wirds wohl relevant) darin gespeichert ist und den dazugehörigen Messwert nebst Zeitstempel in mein Messwertobjekt (TVitalSign) übertragen. Ich gehe davon aus, daß XML Blätter unterhalb eines Knoten nicht sortiert sein müssen, sonst wäre es ja doch einfach. Also Schleife über die ChildNodes bis ich den Node mit Namen OBX.3 gefunden habe. Dann weiss ich welche Messgröße, merken und Schleife von vorne, bis ich den Messwert in OBX.5 habe. Eintragen in mein Objekt und dann Messdatum suchen und eintragen in das Objekt. Das kann es nicht sein. Denke ich falsch oder zu kompliziert?:wall:

Ich mach jetzt erstmal Feierabend und schlafe darüber...

Sherlock

Blackpit 28. Mai 2020 17:33

AW: IXMLDomDocument vs. IXMLDocument
 
Brauchst du noch Hilfe?

Sherlock 29. Mai 2020 08:25

AW: IXMLDomDocument vs. IXMLDocument
 
Danke, ich habs aufgegeben und verwende weiterhin WinAPI.MSXMLIntf. Sollte ich mal doch auf FMX bzw. CrossPlatform umsteigen, werde ich nochmal suchen müssen, aber aktuell fehlt einfach die Zeit.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf