Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi OmniXML: Wie komme ich an das Attribute? (https://www.delphipraxis.net/130041-omnixml-wie-komme-ich-das-attribute.html)

guidok 2. Mär 2009 09:51


OmniXML: Wie komme ich an das Attribute?
 
Ich stehe gerade auf dem Schlauch und trotz intensiver Suche bin ich noch nicht auf die Lösung gekommen.

Ich erzeuge eine XML Datei:

Delphi-Quellcode:
  var
    XMLDoc: IXMLDocument;
    XMLElement : IXMLElement;
    idx: Integer;
begin
  XMLDoc := CreateXMLDoc;

  XMLDoc.DocumentElement := XMLDoc.CreateElement('Root_Testfile');

  for idx := 0 to 1000 do begin
    XMLElement := XMLDoc.CreateElement('Subnode' + IntToStr(idx));
    XMLElement.SetAttribute('Attr1', 'Irgendein Text' + DateTimeToStr(Now));
    XMLDoc.DocumentElement.AppendChild(XMLElement);
  end;
  XMLDoc.Save('C:/XMLTest.xml');
Jetzt möchte ich nach dem Laden wieder auf die Attribute zugreifen (lesen und schreiben), aber wie?

Delphi-Quellcode:
  var
    XMLDoc: IXMLDocument;
    XMLElement: IXMLElement;
    XMLNode : IXMLNode;
begin
  XMLDoc := CreateXMLDoc;

  XMLDoc.Load('C:/XMLTest.xml');

  XMLNode := XMLDoc.SelectSingleNode('Subnode999'); //z.B. Subnode999

himitsu 2. Mär 2009 10:07

Re: OmniXML: Wie komme ich an das Attribute?
 
Delphi-Quellcode:
s := XMLElement.Attributes['Attr1'];
geht dieses?

guidok 2. Mär 2009 10:10

Re: OmniXML: Wie komme ich an das Attribute?
 
Wäre das Ergebnis von "SelectSingleNode" vom Typ IXMLElement, dann würde

Delphi-Quellcode:
XMLElement.GetAttribute('Attr1');
funktionieren. Leider ist das Ergebnis aber vom Typ IXMLNode und da geht das wieder nicht.

himitsu 2. Mär 2009 10:38

Re: OmniXML: Wie komme ich an das Attribute?
 
probir mal das von mir vorgeschlagene

in IXMLNode find ich zumindestens 2 Dinge, welche für Attribute geeignet sind.
Delphi-Quellcode:
//OmniXML.pas
IXMLNode = interface
  function GetAttributes: IXMLNamedNodeMap;
  property Attributes: IXMLNamedNodeMap read GetAttributes;
end;
bzw.
Delphi-Quellcode:
//OmniXML_MSXML.pas
IXMLNode = IXMLDOMNode;
wobei .Attributes auch in IXMLDOMNode vorhanden wäre.


PS: einfach mal XMLElement. eingeben und schauen was dir die Codevervollständigung so anbietet :zwinker:

guidok 3. Mär 2009 14:56

Re: OmniXML: Wie komme ich an das Attribute?
 
Danke himitsu, ich habe mittlerweile etwas dazu gefunden.

In OmniXMLUtils gibt es

Delphi-Quellcode:
function GetNodeAttr(parentNode: IXMLNode; attrName: string;
    var value: WideString): boolean;
und dahinter steckt dann:

Delphi-Quellcode:
function GetNodeAttr(parentNode: IXMLNode; attrName: string;
  var value: WideString): boolean;
var
  attrNode: IXMLNode;
begin
  if IsDocument(parentNode) and assigned(DocumentElement(parentNode)) then
    parentNode := DocumentElement(parentNode);
  attrNode := parentNode.Attributes.GetNamedItem(attrName);
  if not assigned(attrNode) then
    Result := false
  else begin
    value := attrNode.NodeValue;
    Result := true;
  end;
end;


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

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