![]() |
XML Attribut
Hi Delphianer
Ich stehe leider vor einem großen Problem. Ich habe folgendes XML:
Code:
mit folgendem Code frage ich ab, wieviele accdevs es prinzipiell gibt:
<accdevlist>
<accdev accdevindex="1"> <call controllingresource="bla" /> <channel rpsmoduleindex="102" devindexonrps="1" /> <recorder rpsmoduleindex="102" devindexonrps="1" /> <dtmfdetector rpsmoduleindex="102" devindexonrps="1" /> <tonedetector rpsmoduleindex="102" devindexonrps="1" /> </accdev> <accdev accdevindex="2"> <call controllingresource="channel" /> <channel rpsmoduleindex="102" devindexonrps="2" /> <recorder rpsmoduleindex="102" devindexonrps="2" /> <dtmfdetector rpsmoduleindex="102" devindexonrps="2" /> <tonedetector rpsmoduleindex="102" devindexonrps="2" /> </accdev> <accdev accdevindex="3"> <call controllingresource="test" /> <channel rpsmoduleindex="102" devindexonrps="3" /> <recorder rpsmoduleindex="102" devindexonrps="3" /> <dtmfdetector rpsmoduleindex="102" devindexonrps="3" /> <tonedetector rpsmoduleindex="102" devindexonrps="3" /> </accdev> <accdev accdevindex="4"> <call controllingresource="channel" /> <channel rpsmoduleindex="102" devindexonrps="4" /> <recorder rpsmoduleindex="102" devindexonrps="4" /> <dtmfdetector rpsmoduleindex="102" devindexonrps="4" /> <tonedetector rpsmoduleindex="102" devindexonrps="4" /> </accdev> </accdevlist>
Delphi-Quellcode:
Das funktioniert ja prima, ABER ich muss mir jetzt noch zusätzlich auslesen welcher accdevindex welche controllingresource hat.
var
cfg : IXMLDocument; acc : IXMLNode; i : integer; begin CoInitialize(nil); cfg := LoadXMLDocument(ctcfg); acc := cfg.DocumentElement.ChildNodes.First.ChildNodes.First; while not (acc = nil) do begin i := i + 1; acc := acc.NextSibling; end; debug(inttostr(i) + ' found!'); dh. accdevindex 1 = controllingresource bla! Da ich leider mit XMLDom keine Erfahrung habe und ziemlichen Zeit Stress habe würde ich die von mir oben verwendete Methode gerne verwenden, ich weiß nur nicht wie ich hier ansetze. Wenn mir jemand helfen könnte wäre ich mehr als dankbar!!!!!!!! LG value is NULL |
AW: XML Attribut
Hi
habe das jetzt selbst gelöst!
Delphi-Quellcode:
while not (acc = nil) do begin
i := i + 1; //acc := acc.NextSibling; if acc.HasAttribute('accdevindex') then begin if acc.Attributes['accdevindex'] = i then begin test := acc.ChildNodes.First.GetAttributeNS('controllingresource',''); debug('CONTROLLINGRESSOURCE FOR INDEX '+inttostr(i)+': '+test); end; acc := acc.NextSibling; end; end; LG |
AW: XML Attribut
oder via
![]() PS: statt .First + .NextSibling + Zählschleife einfach .Count (ich hoff' das heißt Count, ansonsten gibt's dennoch was Entsprechendes) |
AW: XML Attribut
Ja das mit dem XPath wollte ich mir schon länger anschauen, habe aber wie gesagt Zeitstress das Fertig zu bekommen.
Ich stehe jetzt vor einer neuen Challenge: habe noch folgendes XML
Code:
Meine Aufgabe ist es, das Modul mit dme type ="ACCMGR" zu suchen und dort hin zu gehen.
<world>
<domain> <site> <module servername="SRV1" moduleindex="1100" type="Unknown"> <hw>true</hw> </module> <module servername="SRV2" moduleindex="1101" type="system" > <hw>true</hw> </module> <module servername="SRV3" moduleindex="1110" type="WebServer" > <hw>true</hw> </module> <module servername="SRV4" moduleindex="1111" type="ACCMgr" > <hw>true</hw> </module> </site> </domain> </world> bis zu dem ersten modul komme ich, weiß dann aber nicht wie ich weiter gehe :(
Delphi-Quellcode:
Wie kann ich nach dem subtype"ACCMGR" filtern?
var
xml : IXMLDocument; acc : IXMLNode; CoInitialize(nil); xml := LoadXMLDocument(ctcfg); acc := xml.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.FindNode('voxctmodule') lg |
AW: XML Attribut
irgendwie so?
Delphi-Quellcode:
acc := xml.DocumentElement.ChildNodes.FindNode('domain\site\module[@type=ACCMgr]');
|
AW: XML Attribut
Das schaut ganz gut aus! wenn ich jetzt aber versuche mir "hw" vom type=ACCMgr auszugeben bekomme ich eine Zugriffsverletzung :(
Delphi-Quellcode:
LG
try
CoInitialize(nil); xml := LoadXMLDocument('C:\voxtronic\voxct_v3\bin\test.xml'); acc := xml.DocumentElement.ChildNodes.FindNode('domain\site\module[@type=ACCMgr]'); index := acc.ChildNodes.First.Text; debug('HW : '+index); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: XML Attribut
also nach obigem code bleib acc nil ?!
irgendeinen plan warum? LG |
AW: XML Attribut
Ich weiß jetzt nicht ob FindNode mit XPath zurechtkommt.
Eventuell gibt es ja eine andere Methode, worüber dieses ginge. (ich kann's hier jetzt nicht nachsehn) |
AW: XML Attribut
Hm...
Ich habe vorrübergehend eine while Schleife eingebaut die mir sagt das wievielte modul das gesuchte ist! Wie kann ich jetzt acc sagen das es zB das 3 Modul ist da ich Hw von Type ACCMgr brauche? LG PS: ein Frises Danke an dich himitsu du hast dich bis jetzt immer geäußert! Bin dir ein Bier schuldig ;) |
AW: XML Attribut
ich hab jetzt eine Lösung, allerdings ist die nicht wirklich schön:
Delphi-Quellcode:
was haltest du davon ?!
while not (acc = nil) do begin
i := i + 1; if (acc.HasAttribute('type')) and (acc.Attributes['type'] = 'ACCMgr') then begin debug('FOUND!'); res := res + i; debug('ITEM ID in XML := '+inttostr(i)); end; acc := acc.NextSibling; end; acc := xml.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.FindNode('module'); while not (cache = res) do begin debug('Adding 1 to cache: '+inttostr(cache)); cache := cache + 1; acc := acc.NextSibling; end; LG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz