2009-04-24 17 views
39

Come accedere ai commenti all'interno del documento XML utilizzando XPath?Accesso ai commenti in XML utilizzando XPath

Ad esempio:

<table> 
<length> 12 </length> 
<!--Some comment here--> 
</table> 

voglio accedere al "Qualche commento qui".

Grazie ...

EDIT: Sto usando DOM MSXML ActiveX e il comando di commento() sembra essere in mancanza di ... Qualsiasi idea del perché?

risposta

50

Con il percorso

/foo/bar/comment() 

è possibile selezionare tutti i commenti nell'elemento/foo/bar. Può dipendere dalla tua lingua di scelta, ovviamente. Ma generalmente è così che lo fai. funzione

+0

Sto usando MSXML DOM ActiveX e questo comando sembra non riuscire ... Qualche idea sul perché? – Manoj

+0

No, non ho idea del perché. Sono passati più di 7 anni dall'ultima volta che ho usato le librerie MSXML ... –

+0

Sicuramente la root di xpath è ok? Prova "// comment()" per essere sicuro. – annakata

19

Utilizzo commento() ad esempio: -

/table/length/following::comment()[1] 

seleziona il primo commento che segue l'elemento lunghezza.

Modifica

Manoj chiede in un commento a questa risposta perché questo non sta funzionando in MSXML. La ragione sarà che stai usando MSXML3. Per impostazione predefinita, MSXML3 non utilizza XPath come lingua di selezione, per impostazione predefinita è preceduto da un linguaggio molto più debole (pattern XSL). È necessario impostare XPath come lingua di selezione tramite il metodo setProperty di DOMDocument. Per esempio (in JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
dom.setProperty("SelectionLanguage", "XPath"); 

Ora l'intero linguaggio XPath lavoreranno nelle query (nota un cambio di rottura è predicati indicizzatore si basano 1 in XPath mentre erano 0 con sede a modello XSL).

+1

O semplicemente:/table/comment() [1] – Tomalak

+0

Probabilmente ci sono molti approcci per questo caso specifico ma questo era il più vicino possibile ad una soluzione più generale di trovare il commento dopo un elemento specifico. – AnthonyWJones

+1

Sto usando MSXML DOM ActiveX e questo comando sembra fallire ... Qualche idea sul perché? – Manoj

1

Forse questo coud aiutare, Questo esempio rimuove Commenti

XmlNodeList list = xmlDoc.SelectNodes("//comment()"); 
foreach(XmlNode node in list) 
node.ParentNode.RemoveChild(node); 

si sporse da qui link text

+0

Probabilmente riceverai un errore se ci sono commenti nella root, quindi potresti voler controllare che node.ParentNode non sia nullo. –

3

Sulla base delle osservazioni del op per risposte distaccati (e la mia curiosità sul motivo per cui questa cosa semplice non avrebbe funzionato), ecco il mio suggerimento:

Utilizzando l'espressione XPath suggerita da @Anthony, sono riuscito a caricare il nodo di commento con la seguente funzione JS:

function SelectComment(s) 
{ 
    var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
    if (xDoc) 
    { 
    xDoc.loadXML(s); 
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]"); 
    if (selNode != null) 
     return selNode.text; 
    else 
     return ""; 
    } 
} 

Esempio invocazione:

SelectComment("<table><length> 12</length><!--Some comment here--></table>"); 

uscita:

"Some comment here" 

Note:

a. La tua versione MSXML può variare. Si prega di utilizzare in modo appropriato.

b. Questo tipo di codice è decisamente sconsigliato perché funziona solo su IE.Tuttavia, poiché questo è il tuo requisito esplicitamente dichiarato, ho utilizzato ActiveXObject.

c. Non hai menzionato nei tuoi commenti ciò che non funziona nelle espressioni XPath suggerite. La mia ipotesi è che non si sta interrogando la proprietà text del nodo richiamato. Tieni presente che SelectSingleNode restituisce sempre un valore IXmlNode ed è necessario interrogare le sue proprietà data o text.

Problemi correlati