2009-04-24 27 views
39

XML belgesindeki yorumlara XPath kullanarak nasıl erişilir? ÖrneğinXPath kullanarak XML'de Açıklamalara Erişme

:

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

ben "Burada bazı yorumunu" erişmek istediğiniz.

Teşekkür ...

DÜZENLEME: MSXML DOM ActiveX ve komut yorumunu() Başarısız görünen ... Herhangi bir fikir neden kullanıyorum? yolun

/foo/bar/comment() 

sen/foo/bar elemanı tüm yorumları seçebilir ile

cevap

50

. Elbette dil seçiminize bağlı olabilir. Ama genellikle böyle yaparsın. örneğin

+0

MSXML DOM ActiveX kullanıyorum ve bu komut başarısız görünüyor ... Herhangi bir fikri neden? – Manoj

+0

Hayır, neden olduğu hakkında hiçbir fikrim yok. MSXML kütüphanelerini kullanmamdan bu yana 7 yıl geçti ... –

+0

Xpath kökünüzün iyi mi? Emin olmak için "// comment()" ı deneyin. – annakata

19

kullanımlar yorum() fonksiyonu: -

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

uzunluğu elemanı takip eden ilk yorumunu seçer.

Düzenleme

Manoj bu MSXML neden çalışmadığını Bu yanıta bir yorumda sorar. Nedeni MSXML3 kullanıyor olacaksın. Varsayılan olarak MSXML3, seçim dili olarak XPath kullanmaz, varsayılan olarak daha zayıf bir dile (XSL deseni) geçer. XPath'i DOMDocument'ın setProperty yöntemiyle seçim dili olarak ayarlamanız gerekir. Örn (JScript'te): -

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

Şimdi tam XPath dili Sorgularınızdaki çalışacak (bunlar XSL Kalıbı merkezli 0 idi, oysa bir kırılma değişikliğini not olan dizin yüklemler 1 XPath'de dayanır).

+1

Ya da basitçe:/table/comment() [1] – Tomalak

+0

Muhtemelen bu özel durum için her türlü yaklaşımlar vardır, ancak bu, daha sonra genel olarak belirli bir öğe. – AnthonyWJones

+1

MSXML DOM ActiveX kullanıyorum ve bu komut başarısız gibi görünüyor ... Herhangi bir fikri neden? – Manoj

1

Belki bu yardımcı coud, Bu örnek burada yayınlanan cevaplara OP'ın yorumların (ve bu basit bir şey işe yaramaz neden olarak benim merak dayanarak link text

+0

Kökte yorumlar varsa, büyük olasılıkla bir hatayla karşılaşırsınız. Bu nedenle, node.ParentNode öğesinin null olmadığını kontrol etmek isteyebilirsiniz. –

3

den eğildi Yorumlar

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

kaldırır), öneri:

@Anthony tarafından önerilen XPath ifadesini kullanarak, aşağıdaki düğüm işlevine sahip olan yorum düğümünü başarıyla yükleyebildim:

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 ""; 
    } 
} 

Numune çağırma:

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

Çıktı:

"Some comment here" 

Notlar:

a. MSXML sürümünüz değişebilir. Lütfen uygun şekilde kullanın.

b. Bu tür bir kod kesinlikle IE'de çalıştığı için kesinlikle önerilmez.Ancak, açıkça belirtilen gereksiniminiz olduğundan, ActiveXObject'i kullandım.

c. Yorumlarınızda, önerilen XPath ifadelerinde nelerin başarısız olduğunu belirtmediniz. Tahminim, alınan düğümün text özelliğini sorgulamamanızdır. SelectSingleNode öğesinin her zaman bir IXmlNode döndürdüğünü ve data veya text özelliklerini sorgulamanız gerektiğini unutmayın.