2017-01-25 5 views
0

Ich versuche, das Parsen von XML in MATLAB zu tun, die JavaSE Paket verwendet org.w3c.domgetChildNodes() gibt Text statt NodeList

I wie

eine XML-Struktur haben

<?xml version="1.0" encoding="utf-8"?> 
 
<tada> 
 
    <Filters> 
 
    <filter id="1" name="name1" renderType="type1"> 
 
     <bool name="par1" value="false"/> 
 
     <bool name="par2" value="false"/> 
 
     <int name="par3" value="200"/> 
 
     <int name="par4" value="1"/> 
 
     <float name="par5" value="2"/> 
 
     <bool name="par6" value="false"/> 
 
     <int name="par7" value="1"/> 
 
    </filter> 
 
    <filter id="6" name="name2" renderType="type2"> 
 
     <bool name="par1" value="false"/> 
 
     <bool name="par2" value="false"/> 
 
     <int name="par3" value="200"/> 
 
     <int name="par4" value="1"/> 
 
     <float name="par5" value="2"/> 
 
     <bool name="par6" value="false"/> 
 
     <int name="par7" value="1"/> 
 
     <int name="par8" value="1"/> 
 
     <array name="par9" row="2" col="2" > 
 
     5.0162 0.96182 
 
     0.22294 0.96356 
 
     </array> 
 
    </filter> 
 
    </Filters> 
 
</tada>

ich versuche, Zugang zu bekommen, lassen Sie sagen Attribut renderType des Elements Filter mit name = "na me2"

Ich versuche, die folgende

config = xmlread(xmlFileName); 
 

 
section = config.getDocumentElement().getElementsByTagName('Filters').item(0); 
 
    
 
filters = section.getChildNodes(); 
 
// filters = section.getElementsByTagName('filter'); 
 

 
for i = 0:filters.getLength()-1 
 
    filter = filters.item(i); 
 
    if strcmp(filter.getAttribute('name'), 'name2') 
 
     filter.setAttribute('renderType', 'graph2D'); 
 
    end 
 
end

ich zu tun erwarten, dass Filter sollte ein NodeList (wie Dokumentation sagt http://docs.oracle.com/javase/6/docs/api/org/w3c/dom/package-summary.html?browser=F1help), aber es wird zurückgegeben als Text (der nur Leerzeichen enthält).

Wenn ich

filters = section.getElementsByTagName('filter');

dann schreibe ich gewünschten NodeList bekommen, aber das Problem ist, dass diese Art und Weise ungeeignet ist. Weil ich Knoten durch den Wert Name Eigenschaft auswählen muss.

Können Sie mir helfen? Was ich falsch mache?

Vielen Dank für Ihre Hilfe.

Antwort

0

Ihr XML-Dokument enthält Leerzeichen zwischen den Elementen. Dies wird vom XML-Parser als signifikant angesehen. Wenn Sie die DOM-Methode getChildNodes() verwenden, enthält sie sowohl die untergeordneten Elemente als auch die untergeordneten Textknoten, die den Leerraum enthalten. Wenn Sie die untergeordneten Knoten verarbeiten möchten, müssen Sie die Leerzeichen-Textknoten explizit ignorieren.

+0

Vielen Dank. Aber sollte nicht .getChildNodes() mir irgendeine Knotenliste zurückgeben? Und wie bekomme ich die Liste der Elemente, ohne den Tag-Namen anzugeben? – Physman

+0

Nochmals vielen Dank. Ich habe verstanden, was du meinst. Obwohl ** filters ** nicht NodeList ist, kann ich .item (...) normalerweise verwenden. Ich sollte nur den resultierenden Typ eines ** Filter ** Knotens überprüfen. – Physman

+0

Ich denke, Sie könnten den Fehler machen, "Knoten" und "Element" zu verwenden, als wären sie das Gleiche. –