XML dosyasından yorumları retreive için herhangi bir yolu var mı?

3 Cevap php

XML dosyasından yorumları almak için herhangi bir yolu var mı?

Ben de yorumları ile, bir XML dosyası var ve ben bu dosyada her düğüm tabanlı bir kullanıcı arayüzü ve ilgili yorumlarınızı oluşturmak zorunda.

Ben bu yorumları almak için bir yol bulmak gibi olamaz. Ben SimpleXML kullanarak onlardan 'bazı' almak mümkün, ama kök düğüm için işe yaramadı, ve oldukça garip davranıyordu ... kendi düğüm koymak bazı yorumlar wre, diğer bazı oğul gibi yaptı, ve tüm edildi comments aynı düğüm bindirildi ... emin değil bu, herhangi bir mantıklı :) nokta SimpleXML yorumların yapısını kırdı ve benim ihtiyaçları için iyi değil idi.

3 Cevap

Sen tüm düğümleri ile okumak ve yorum çekin XMLReader kullanabilirsiniz. Ben sadece düğümleri dışarı çeker gibi, başlamak için bazı örnek kodu dahil ettik, ve where açıklama herhangibir xml düğümleri altında veya üstünde, içinde olduğunu dikkate almaz.

$comments = '';
$xml =<<<EOX
<xml>
    <!--data here -->
    <data>
        <!-- more here -->
        <more />
    </data>
</xml>
EOX;

$reader = new XMLReader();
$reader->XML($xml);

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::COMMENT) {
      $comments .= "\n".$reader->value;
  }
}

$reader->close();

echo "all comments below:\n-------------------".$comments

Beklenen çıktısı:

all comments below:
-------------------
 data here
 more here

Yani yorumların sadece değerleri (<!-- --> değil) yanı sıra boşluk olarak alınacaktır.

SimpleXML şey hızlı kapma için iyidir, ama sınırlamaları vardır. Yerine DOM ayrıştırıcı kullanın. Ya da bu durumda, belki de bir olay tabanlı bir (SAX veya XmlReader).

XPath kullanmak eğer basit. comment() function yorumlarınızı eşleşir. Böylece model

//comment()

Belgedeki tüm açıklamaları bulur.

XSLT'de, comment, örneğin dönüştürme ediyorsanız elementten önce genel desen için:

<!-- This is the comment -->
<element>...

Bir şablon gibi kullanmak istiyorum:

<xsl:template match="*[.::preceding-sibling()/comment()]">
   <xsl:variable name="comment" select=".::preceding-sibling()/comment()"/>
   <!-- xsl:value-of $comment will now give you the text of the comment -->
   ...