Nitelik değerine göre Öğe seçmek için XPath


195

Aşağıdaki XML var.

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghna</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

İd = "4" ile Çalışan öğesini seçmek istiyorum.

Hiçbir şey döndürmüyor XPath aşağıdaki ifadeyi kullanıyorum.

//Employee/[@id='4']/text()

Ben http://chris.photobooks.com/xml/default.htm adresinden kontrol ettim ve geçersiz xpath diyor, sorunun nerede olduğundan emin değilim.

Yanıtlar:


278

Sen kaldırmak gerekir /önce [. Tahminleri (içindeki parçalar [ ]) hemen önlerinde eğik çizgiler olmamalıdır. Ayrıca, Çalışan öğesinin kendisini seçmek için /text(), sonunda bırakmanız gerekir, aksi takdirde sadece Çalışan öğesinin altındaki boşluk metin değerlerini seçersiniz .

//Employee[@id='4']

Düzenleme: Jens yorumlarda belirtildiği gibi, //belgenin tamamında eşleşen düğümleri aradığı için çok yavaş olabilir. Üzerinde çalıştığınız belgelerin yapısı tutarlı olacaksa, muhtemelen en iyi yolu tam olarak kullanamazsınız, örneğin:

/Employees/Employee[@id='4']

3
Belgenin yavaş olabilen tüm düğümlerini seçtiğini //ve aradığını unutmayın . Bunun yerine, belgenin yapısı biliniyorsa, aşağıdaki Gilles'in cevabında önerildiği gibi uygun bir yol kullanın .
Jens

@Jens Evet, bu kesinlikle doğru. Bir ek eklemek için cevabımı düzenledim.
JLRishe

13

Aşağıdaki gibi, "belirli bir özniteliğe sahip tüm düğümleri" şu şekilde seçebilirsiniz:

//*[@id='4']

12

Bunu yapmayı deneyin:

/Employees/Employee[@id=4]/*/text()

xmllint kimlikleri aramadan önce tüm xml dosyasını belleğe yükler mi? 46 GB'lık bir xml
Hani Goc

46 GB xml dosyası - sorun var.
Gurwinder Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.