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

XML-Template verändern/bearbeiten

 

mnikoli
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 10.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2010, 19:29     Titel: XML-Template verändern/bearbeiten
  Antworten mit Zitat      
Hallo an alle,

über google stoße ich immer wieder auf dieses Forum, weshalb ich hier mal mein Glück versuche. Leider bin ich kein MATLAB-Freak, wie es hier manche sind, habe jedoch extreme Hochachtung vor allen, die MATLAB beherschen! Würde ich auch gerne mal dazu gehören Wink

Nun zu meinem Problem. Folgende Aufgabestellung:

Nach einem Test, sollen alle Spezifikationen (Anforderungen, Ergebnisse...) in ein bestehendes XML-Template geschrieben werden. Dazu "lese" ich erst einmal das XML-Template, anschließend gehe ich an die gewünschte Stelle im template und möchte ab dieser Stelle den Rest löschen. Praktisch alle Kindknoten löschen. Danach erzeuge ich ein xml-template und lade alle Spezifikationen ein.

Jetzt zu meinem Problem: wenn ich die Kindknoten ab einer Stelle löschen möchte, wird ein Fehler angezeigt. "Keine angemessene Klasse oder irgendwie so".

Mein Code:

%----------------------------------------------------------------------
%----------------- OPEN EXISTING XML-TEMPLATE TO READ
%----------------------------------------------------------------------

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

%----------------------------------------------------------------------
%---- SEARCH IN XML-TEMPLATE, WHERE THE SECTION 'SW-TEST-CASES' BEGINS
%----------------------------------------------------------------------

%------- DETERMINE ALL CHAPTER-ELEMENTS --------
allListItems = xmlDocu.getElementsByTagName('CHAPTER');
node=allListItems.item(22);


%----------------------------------------------------------------------
%--------REMOVE THE CURRENT SECTION 'SW-TEST-CASES' -----------------
%----------------------------------------------------------------------


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

%----------------------------------------------------------------------
% ----------- CREATE THE NEW SECTION 'SW-TEST-CASES' ------------------
%----------------------------------------------------------------------

docNode = com.mathworks.xml.XMLUtils.createDocument('CHAPTER')
docRootNode = docNode.getDocumentElement;

LongName = docNode.createElement('LONG-NAME');
LMV = docNode.createElement('L-4');

LongName.appendChild(LMV);
LMV.appendChild(docNode.createTextNode(sprintf('Testcases')));
docRootNode.appendChild(LongName);

LoName= docNode.createElement('LONG-NAME');
Chapter=docNode.createElement('CHAPTER');
LMV1 = docNode.createElement('L-4');
ShortName=docNode.createElement('SHORT-NAME');

Der COde geht noch weiter, aber das ist net so wichtig. Kann mir jemand hierbei helfen? Danke jetzt schon.
Private Nachricht senden Benutzer-Profile anzeigen


Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2010, 09:29     Titel:
  Antworten mit Zitat      
Kannst Du mal die genaue Fehlermeldung schreiben und sagen auf welche Zeile es sich bezieht (aber bitte nicht nur die Zeilennummer Wink ). Das würde die Sache erleichtern...

Was genau willst Du eigentlich machen...mir scheint Du machst im letzten Abschnitt ein ganz neues Dokument-Element auf statt nur einen Child hinzu zu fügen...dann wäre aber das löschen vorher glaub ich sinnlos...aber ich hab nur schnell drüber geschaut...muss ich mich noch näher mit befassen.
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: 14.05.2010, 02:09     Titel:
  Antworten mit Zitat      
Hi Zenon,

dank dir erst einmal, dass du versuchst mir zu helfen.
Leider kann ich erst am Montag Abend die Fehlermeldung posten. Was ich eigentlich machen möchte, kann ich aber jetzt schon mal sagen. kann sein, dass das löschen sinnlos ist, jedoch weiß ich nicht, wie ich es sonst machen kann.

Mein Ziel:

Es besteht bereits ein großes xml-Template. In diesem großen Template existiert ein kleiner Teil names "SW-Test-Cases", wo ich immer wieder manuell nach einem Testdurchlauf die alten Spezifikationen, wie Autor, Beschreibung, Datum.. und und und löschen und die neuen Spezifikationen reinschreiben muss. Dies möchte ich automatisieren, da dies ein riesen Zeitaufwand ist.

meine Idee, wie ich dies mache war folgende:

1. Zunächst öffne ich das bestehende große xml-Template.
2. Ich suche den Absatz "SW-Test-Cases", wo sich bereits Spezifikationen eines alten Tests befinden.
3. Diese alten Spezifikationen möchte ich löschen. Ich möchte den kompletten Absatz "SW-Test-Cases" löschen, um einen neuen Absatz "SW-Test-Cases" zu erzeugen.
4. Nachdem ich den alten Absatz "SW-Test-Cases" gelöscht habe, erzeuge ich nun ein neues Template, d.h. einen neuen Absatz "SW-Test-Cases" und lese die neunen Spezifikationen vom aktuell Test ein

Somit habe ich dies automatisiert, und muss nicht immer per Hand alte Spezifikationen löschen und die neuen rein schreiben. Ist diese Idee machbar? Weil du meintest, dass das Löschen keinen Sinn macht? Ich dachte, wenn ich das Kind lösche, lösche ich den ganzen Absatz "SW-Test-Cases".
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: 17.05.2010, 13:17     Titel:
  Antworten mit Zitat      
so.. Mein Problem war das Löschen von Kinknoten. Immer wieder trat der Fehler:

??? No appropriate method, property, or field childNodes for
class org.apache.xerces.dom.DeferredElementImpl.

Error in ==> getTests at 26
while(node.childNodes.getLength >0)


Jetzt habe ich es gelöst. Die Methode childNodes gibt es nicht in der oben genannten Klasse.

Dies ist mein geänderter Code. In dunkelrot ist meine Änderung angezeigt.

%----------------------------------------------------------------------
%--------REMOVE THE CURRENT SECTION 'SW-TEST-CASES' -----------------
%----------------------------------------------------------------------


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


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


%----------------------------------------------------------------------
% ----------- CREATE THE NEW SECTION 'SW-TEST-CASES' ------------------
%----------------------------------------------------------------------

docNode = com.mathworks.xml.XMLUtils.createDocument('CHAPTER')
docRootNode = docNode.getDocumentElement;

LongName = docNode.createElement('LONG-NAME');
LMV = docNode.createElement('L-4');

LongName.appendChild(LMV);
LMV.appendChild(docNode.createTextNode(sprintf('Testcases')));
docRootNode.appendChild(LongName);

LoName= docNode.createElement('LONG-NAME');
Chapter=docNode.createElement('CHAPTER');
LMV1 = docNode.createElement('L-4');
ShortName=docNode.createElement('SHORT-NAME');

Der COde geht noch weiter...


Schritt 1. bis 3. habe ich jetzt erledigt. Nur habe ich jetzt ein Problem mit Schritt 4.

1. Zunächst öffne ich das bestehende große xml-Template.
2. Ich suche den Absatz "SW-Test-Cases", wo sich bereits Spezifikationen eines alten Tests befinden.
3. Diese alten Spezifikationen möchte ich löschen. Ich möchte den kompletten Absatz "SW-Test-Cases" löschen, um einen neuen Absatz "SW-Test-Cases" zu erzeugen.
4. Nachdem ich den alten Absatz "SW-Test-Cases" gelöscht habe, erzeuge ich nun einen neuen Teil im Template, d.h. einen neuen Absatz "SW-Test-Cases" und lese die neunen Spezifikationen vom aktuell Test ein.

Mein Problem ist, dass ich in das gelesene Template (xmlDocu) mein neu erzeugtes Dokument (docNode) nicht einbinden kann. Denn docNode ist ein neues Dokument, was sich nicht einfach in ein gelesenes Dokument (xmlDocu) einbringen lässt.

Deshalb meine Frage: Wie bringe ich den Absatz docNode (neues Dokument) in xmlDocu ein?? oder gibt es eine andere Methode um docNode zu erzeugen und an xmlDocu anzuhängen, ohne ein neues Dokument zu erzeugen?

Wenn ich mich nicht richtig ausgedrückt habe, bitte bescheid geben. Ist nämlich sehr wichtig. Danke vorab schon mal!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2010, 13:39     Titel:
  Antworten mit Zitat      
Also im Prinzip müsstest Du einfach kein neues Dokument erstellen, sondern überall wo du docRootNode nutzt den node vom Löschen-Teil nutzen...dann solltest Du an die Stelle des frisch gelöschten childs das neue child anbinden...dann einfach dein Urspungsdokument mit xmlwrite speichern...
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: 17.05.2010, 14:24     Titel:
  Antworten mit Zitat      
Habe ich meinen Code richtg geändert? Also wenn ich docRootNode durch node ersetze (genau an drei Stellen - siehe rote Markierung), dann passiert nichts. das Dokument 'xmlDocu' wird geöffnet und der eine Teil gelöscht. Aber leider wird nichts angehängt. Also die Tags ab docNode werden dem Dokument 'xmlDocu' nicht angehängt. müsste ich nicht etwas mit docNode machen? Da ich doch da ein neues Dokument erzeuge.

Hmm, also ich stehe da auf dem Schlau. Wie muss ich meinen Code ändern?

%--------------------------------------------------------------------------
%----------------- OPEN EXISTING XML-TEMPLATE TO READ ---------------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
%---- SEARCH IN XML-TEMPLATE, WHERE THE SECTION 'SW-TEST-CASES' BEGINS ----
%--------------------------------------------------------------------------

%------- DETERMINE ALL CHAPTER-ELEMENTS --------
allListItems = xmlDocu.getElementsByTagName('CHAPTER');
node=allListItems.item(22);


%-----search the section with the Text Content 'SW-Test'-----
%allListItems.getTextContent('SW-Test')

%--------------------------------------------------------------------------
%------------- REMOVE THE CURRENT SECTION 'SW-TEST-CASES' -----------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
% --------------- CREATE THE NEW SECTION 'SW-TEST-CASES' ------------------
%--------------------------------------------------------------------------

docNode = com.mathworks.xml.XMLUtils.createDocument('CHAPTER');
node = docNode.getDocumentElement;

LongName = docNode.createElement('LONG-NAME');
LMV = docNode.createElement('L-4');

LongName.appendChild(LMV);
LMV.appendChild(docNode.createTextNode(sprintf('Testcases')));
node.appendChild(LongName);



lastID = '';
for pos = 1:length(TS.statistic.testCase.req)

aktReq = TS.statistic.testCase.req(pos);
% wenn letzte testID gleich aktueller, überspringe pos
if strcmp(lastID,aktReq.testID)
continue
end
aktReq, pos
lastID = aktReq.testID;

LoName= docNode.createElement('LONG-NAME');
Chapter=docNode.createElement('CHAPTER');
LMV1 = docNode.createElement('L-4');
ShortName=docNode.createElement('SHORT-NAME');

Chapter.appendChild(LoName);
LoName.appendChild(LMV1);
LMV1.appendChild(docNode.createTextNode(aktReq.testID));
node.appendChild(Chapter);


ShortName.appendChild(docNode.createTextNode(sprintf('(TQL_OvrldInvLim_%d)', pos)));
Chapter.appendChild(ShortName);
end

%--------------------------------------------------------------------------
%--------------------- SAVE THE EDITED XML DOCUMENT -----------------------
%--------------------------------------------------------------------------

xmlFileName = [tempname,'.xml'];
xmlwrite(xmlFileName,xmlDocu);

%--------------------------------------------------------------------------
%--------------------- OPEN THE EDITED XML DOCUMENT -----------------------
%--------------------------------------------------------------------------

edit(xmlFileName);[color=#][/color]
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2010, 14:36     Titel:
  Antworten mit Zitat      
Wie ich in meinem vorhergehenden Post geschrieben habe, erstellst Du KEIN neues Dokument.

Du hast doch schon eins, was jede Menge Zeug enthält, das Du nicht gelöscht hast und nicht löschen wolltest.

Was ich sagen wollte war:

Nutze immer die Knoten deines alten Dokumentes, du musst doch nur an der Stelle, wo Du den entsprechenden Eintrag gelöscht hast einen neuen erstellen. Ein weiteres DOM-Dokument brauchst du doch gar nicht...

Code:

%--------------------------------------------------------------------------
%----------------- OPEN EXISTING XML-TEMPLATE TO READ ---------------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
%---- SEARCH IN XML-TEMPLATE, WHERE THE SECTION 'SW-TEST-CASES' BEGINS ----
%--------------------------------------------------------------------------

%------- DETERMINE ALL CHAPTER-ELEMENTS --------
allListItems = xmlDocu.getElementsByTagName('CHAPTER');
node=allListItems.item(22);


%-----search the section with the Text Content 'SW-Test'-----
%allListItems.getTextContent('SW-Test')

%--------------------------------------------------------------------------
%------------- REMOVE THE CURRENT SECTION 'SW-TEST-CASES' -----------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
% --------------- CREATE THE NEW SECTION 'SW-TEST-CASES' ------------------
%--------------------------------------------------------------------------


LongName = xmlDocu.createElement('LONG-NAME');
LMV = xmlDocu.createElement('L-4');

LongName.appendChild(LMV);
LMV.appendChild(xmlDocu.createTextNode(sprintf('Testcases')));
node.appendChild(LongName);



lastID = '';
for pos = 1:length(TS.statistic.testCase.req)

aktReq = TS.statistic.testCase.req(pos);
% wenn letzte testID gleich aktueller, überspringe pos
if strcmp(lastID,aktReq.testID)
continue
end
aktReq, pos
lastID = aktReq.testID;

LoName= xmlDocu.createElement('LONG-NAME');
Chapter=xmlDocu.createElement('CHAPTER');
LMV1 = xmlDocu.createElement('L-4');
ShortName=xmlDocu.createElement('SHORT-NAME');

Chapter.appendChild(LoName);
LoName.appendChild(LMV1);
LMV1.appendChild(xmlDocu.createTextNode(aktReq.testID));
node.appendChild(Chapter);


ShortName.appendChild(xmlDocu.createTextNode(sprintf('(TQL_OvrldInvLim_%d)', pos)));
Chapter.appendChild(ShortName);
end

 


Wenn Dein Code bisher ein neues DOM-Object angelegt hat mit all seinen Childs etc... sollte er so die selben Childs in deinem alten DOM-Object anlegen...das musst du dann noch speichern...

Kommt hier denn eine Fehlermeldung (die nicht damit zusammenhängt, dass ich irgendwo vergessen habe docNode durch xmlDocu zu ersetzen)?
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: 17.05.2010, 15:11     Titel:
  Antworten mit Zitat      
Danke für die SUPER schnelle Antwort!
Ich verstehe. Meinst du das so (rote Markierung)?

Und nur noch zur kurzen Info, damit sich keinem die Haare streuben: "Ich bin blutiger Anfänger in MATLAB. Habe mir alles, was ich bisher gemacht habe, selber in 2 Wochen beigebracht. Von daher , bitte nicht sauer sein, wenn ich etwas nicht auf anhieb verstehe." Wink


%--------------------------------------------------------------------------
%----------------- OPEN EXISTING XML-TEMPLATE TO READ ---------------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
%---- SEARCH IN XML-TEMPLATE, WHERE THE SECTION 'SW-TEST-CASES' BEGINS ----
%--------------------------------------------------------------------------

%------- DETERMINE ALL CHAPTER-ELEMENTS --------
allListItems = xmlDocu.getElementsByTagName('CHAPTER');
node=allListItems.item(22);

%--------------------------------------------------------------------------
%------------- REMOVE THE CURRENT SECTION 'SW-TEST-CASES' -----------------
%--------------------------------------------------------------------------

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

%--------------------------------------------------------------------------
%------------- APPEND NEW CHILDS FROM THIS SECTION ------------------------
%--------------------------------------------------------------------------
NewChild = node.createElement('CHAPTER');
node.appendChild(NewChild);



%--------------------------------------------------------------------------
%--------------------- SAVE THE EDITED XML DOCUMENT -----------------------
%--------------------------------------------------------------------------

xmlFileName = [tempname,'.xml'];
xmlwrite(xmlFileName,xmlDocu);

%--------------------------------------------------------------------------
%--------------------- OPEN THE EDITED XML DOCUMENT -----------------------
%--------------------------------------------------------------------------

edit(xmlFileName);





Folgender Fehler wird mir angezeigt:

??? No appropriate method, property, or field createElement for class
org.apache.xerces.dom.DeferredElementImpl.

Error in ==> getTests at 33
NewChild = node.createElement('CHAPTER');



---------
Und hier die Methoden von node mit-> methods(node):


Methods for class org.apache.xerces.dom.DeferredElementImpl:

addEventListener
appendChild
cloneNode
compareDocumentPosition
compareTreePosition
dispatchEvent
equals
getNodeName
getNodeIndex
getNodeType
getAttribute
getNodeValue
getAttributeNS
getOwnerDocument
getAttributeNode
getParentNode
getAttributeNodeNS
getPrefix
getAttributes
getPreviousSibling
getBaseURI
getReadOnly
getClass
getTagName
getChildNodes
getSchemaTypeInfo
getElementsByTagName
getTextContent
getElementsByTagNameNS
getTypeName
getFeature
getTypeNamespace
getFirstChild
getUserData
getLastChild
getLocalName
getLength
getNextSibling
getNamespaceURI
hashCode
hasChildNodes
hasAttributes
hasAttributeNS
hasAttribute
isDefaultNamespace
insertBefore
item
isDerivedFrom
isSupported
isSameNode
isEqualNode
lookupNamespaceURI
lookupPrefix
needsSyncChildren
normalize
notify
notifyAll
removeAttribute
removeAttributeNS
removeAttributeNode
removeChild
replaceChild
removeEventListener
setIdAttribute
setAttributeNodeNS
setIdAttributeNS
setIdAttributeNode
setNodeValue
setPrefix
setReadOnly
setTextContent
setAttributeNode
setUserData
setAttribute
setAttributeNS
toString
wait



nur hilft mir da keine weiter, um ein neues Node anzufügen, oder? also createElement wäre doch erst zum erzeugen und dann apendChild zum anfügen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2010, 15:33     Titel:
  Antworten mit Zitat      
%--------------------------------------------------------------------------
%------------- APPEND NEW CHILDS FROM THIS SECTION ------------------------
%--------------------------------------------------------------------------
NewChild = xmlDocu.createElement('CHAPTER');
node.appendChild(NewChild);

für createElement musst Du auf Dein Dokument xmlDocu zugreifen...das Element wird dann an deinen Knoten angehängt...

Bin auch nicht wirklich gut in dem XML-Kram...aber wenn das hier echt nicht klappt schickste mir mal Deine XML-Datei und ich schaus mir näher an...habe aber erst nächste Woche wieder Zeit dafür...
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: 17.05.2010, 15:53     Titel:
  Antworten mit Zitat      
ZENOOOOOOOOOOOOOOOON FOR PRESIDEEEEEEEENT!!!

JUHUUUUU!!!!! Es Klaaaaappt! Es hat geklaaaaaaaaaappt!!!

Danke Zenon! Deinen Titel des Matlab GURU Kannst du mit Ehre weiter vertreten! Wink

Vielen Dank nochmals!!!!
Jaaaaaaaaaaaaaaaaaaaaaaaaa Maaaaaaaaaaaaaaaaaan!!! Very Happy
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.