WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

dynamische suche nach einem bestimmten Tag

 

mnikoli
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 08:30     Titel: dynamische suche nach einem bestimmten Tag
  Antworten mit Zitat      
Hallo an alle,

ich habe eine xml-Template gelesen (xmlread) und suche nun nach einem bestimmten Tag (CHAPTER), um diesen zu löschen. Funktioniert auch alles ganz gut. Bisher habe ich dies so gelöst:

docu = 'datei.xml';
xmlDocu = xmlread(docu);

allListItems = xmlDocu.getElementsByTagName('CHAPTER');
node=allListItems.item(22);


mit diesem Code suche ich nach diesem Tag. Jedoch habe ich vorher geschaut an welcher position sich der Tag im diesem Template befindet. So kann ich ihn direkt ansprechen.

Es kann jedoch sein, dass sich dieses Template irgendwann man verändert und an der position allListItems.item(22); plötzlich ein anderer Tag befindet. Damit lösche ich den falschen. Ich möchte jedoch weiterhin den Tag CHAPTER ansprechen können, d.h. nach ihm suchen können. WIe geht das genau?

Dies habe ich bisher versucht:

Vergleich=xmlDocu.getElementsByTagName('CHAPTER').item(21).getChildNodes.getTextContent;
Vergleich = char(Vergleich)
if strcmp('SW-Test','Vergleich')
disp('Hello');
else
disp('NOT FOUND');


jedoch sagt er mir immer : NOT FOUND

Ich möchte dynamisch suchen können, unabhängig vom Template.

Danke
Private Nachricht senden Benutzer-Profile anzeigen


Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 09:29     Titel:
  Antworten mit Zitat      
1. 'Vergleich' ohne Hochkomma, da Variable

Code:

if strcmp('SW-Test',Vergleich)
 


2. Was soll diese Code Zeile bewirken

Code:

Vergleich=xmlDocu.getElementsByTagName('CHAPTER').item(21).getChildNodes.getTextContent;
 


3. Dem 'Chapter' von vorneherein eine ID verpassen und dann mit

Code:

xmlDocu.getElementById('ID...')
 


arbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
mnikoli
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 10:25     Titel:
  Antworten mit Zitat      
Hast Recht. Mir fällt auf, dass Vergleich keinen Sinn macht, da ich wieder nach einem bestimmten Tag "item(21)" suche. Somit wieder nicht dynamisch.

Das mit getElementByTag() habe ich versucht, jedoch habe ich das Problem, dass ich dann keine Folgemethode zu Löschen von Kindknoten habe.

------ Suche nach der ID ---------------------------------------------

particID = xmlDocu.getElementById('ID="ID99727363389097');
node = particID;
node=struct(node);

Die letzte Zeile mit struct () habe ich hinzugefügt, da mir sonst folgender Fehler auftritt:
??? Attempt to reference field of non-structure array.

Error in ==> getTests at 36
if(node.hasChildNodes())


------ Lösche alle Kindknoten des Tags der ID----------------------

if(node.hasChildNodes())
while(node.getLength >0)
node.removeChild(node.item(0));
end
end



Hie rkommt folgender Fehler, da node nicht diese Methode enthält:
??? Reference to non-existent field 'hasChildNodes'.

Error in ==> getTests at 36
if(node.hasChildNodes())


Als Anhang habe ich die Methoden von node bereitgestellt.

Wie komme ich nun dazu die Kindknoten zu löschen?

methods.JPG
 Beschreibung:
Methoden von node

Download
 Dateiname:  methods.JPG
 Dateigröße:  58.05 KB
 Heruntergeladen:  490 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 10:56     Titel:
  Antworten mit Zitat      
du darfst node nicht in eine struct umwandeln.

Versuch es stattdessen mal so:

Code:

childNode = node.getFirstChild;
while ~isempty(childNode)
  oldNode = childNode;
  childNode = childNode.getNextSibling;
  node.removeChild(oldNode);
end
 


Hab es nicht getestet...ACHTUNG das sollte alle childNodes von node löschen...
Private Nachricht senden Benutzer-Profile anzeigen
 
mnikoli
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 11:51     Titel:
  Antworten mit Zitat      
Warum darf ich node nicht in ein struct umwandeln?

Habe jetzt deinen Vorschlag versucht:

--Tag finden---
node = xmlDocu.getElementById('ID="ID99727363389097');

----Löschen----
childNode = node.getFirstChild;
while ~isempty(childNode)
oldNode = childNode;
childNode = childNode.getNextSibling;
node.removeChild(oldNode);
end

Fehler tritt auf:
??? Attempt to reference field of non-structure array.

Error in ==> getTests at 32
childNode = node.getFirstChild;


Was sagt mir der Fehler überhaupt? Dass ich versuche auf ein Nicht-Struct Array zuzuweisen, oder? Das heißt, node sollte struct sein? Verstehe nicht..

Bitte einwenig Geduld mit mir Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 13:04     Titel:
  Antworten mit Zitat      
Was in der getElementById-Klammer steht ist schon die Id es gehört kein ID=... da rein:

Code:

node = xmlDocu.getElementById('ID99727363389097');


if ~isempty(node) && node.getNodeType == node.ELEMENT_NODE

childNode = node.getFirstChild;
while ~isempty(childNode)
oldNode = childNode;
childNode = childNode.getNextSibling;
node.removeChild(oldNode);
end

else
disp('KEIN ELEMENT');
end
 


Deine Fehlermeldung kam, weil er die Id 'ID=ID...' nicht gefunden hat (gibts auch nicht).

Die neue if-Verzweigung prüft ob node nicht leer ist (also ein node mit der ID gefunden wurde und ob dieser ein Element ist (und z.B. nicht ein KOmmentar).
Private Nachricht senden Benutzer-Profile anzeigen
 
mnikoli
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 07:00     Titel:
  Antworten mit Zitat      
Also das Löschen gibt mir keinen Fehler mehr an. Allerdings tritt jetzt ein neuer Fehler auf:

---LESE TEMPLATE---
Code:
docu = 'Datei.xml';
xmlDocu = xmlread(docu);


---SUCHE NACH CHAPTER ÜBER DIE ID---
Code:
node = xmlDocu.getElementById('ID99727363389097');


---LÖSCHE ALLE KINDER VON CHAPTER ID---
Code:
if ~isempty(node) && node.getNodeType == node.ELEMENT_NODE
   
    childNode = node.getFirstChild;
        while ~isempty(childNode)
        oldNode = childNode;
        childNode = childNode.getNextSibling;
        node.removeChild(oldNode);
        end
else
    disp('KEIN ELEMENT');
end


---FÜGE NEUE KINDER HINZU---
Code:
LongName = xmlDocu.createElement('LONG-NAME');
LMV = xmlDocu.createElement('L-4');
       
LongName.appendChild(LMV);
LMV.appendChild(xmlDocu.createTextNode(sprintf('Testcases')));
node.appendChild(LongName);



Die letzte Zeile wird mir als Fehler erkannt:
??? Attempt to reference field of non-structure array.

Error in ==> getTests at 65
node.appendChild(LongName);



node hat doch keine methode "append.Child". Habe im letzten oder vorletzten Beitrag ein Bild eingefügt, wo alle Methoden von node aufgelistet sind.
Außerdem verstehe ich nicht warum mir bezüglich der oberen CODE´s kein Fehler angezeigt wird. Beim 3.Absatz "LÖSCHEN" greife ich mit der Methode getFirstChild auf node zu
Code:
childNode = node.getFirstChild;
. Wenn ich diese CODE-Zeile jedoch in das CommandWIndow direkt eingebe, bekomme ich die Fehlermeldung

??? Attempt to reference field of non-structure array.

Wieso bekomme ich also bei EIngabe der Code-Zeile in das COmmandWindow eine Fehlermeldung und im Gesamt-Code, wie oben zu sehen selbst nicht?

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2010, 14:33     Titel:
  Antworten mit Zitat      
Hallo, bin zurück Wink

das Bild, das Du angehängt hast zeigt die Methoden für die Klasse double (wie es auch drüber steht). node kennt die Methode appendChild.

Code:

LMV = xmlDocu.createElement('L-4');
LMV.appendChild(xmlDocu.createTextNode(sprintf('Testcases')));
LongName.appendChild(LMV);
node.appendChild(LongName);
 


Versuche es mal in dieser Reihenfolge...ansonsten fällt mir gerade nichts auf, was definitiv falsch wäre...

Das steht doch bei dir alles in einer großen Funktion oder?


Wenn Du den Kram im Cmd-Fenster eingibst, ist node dann auch richtig geladen worden? Es sollte genauso gehen, wie mit dem m-File...
Private Nachricht senden Benutzer-Profile anzeigen
 
mnikoli
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2010, 06:47     Titel:
  Antworten mit Zitat      
Hi Zenon,

bin wieder zurück. War ne längere zeit im Ausland.

Danke dir für die Hilfe. Hat mir geholfen!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.