Pregunta

¿Hay alguna manera de recuperar los comentarios de un archivo XML?

tengo un archivo XML, con comentarios en el mismo, y tengo que construir una interfaz de usuario basada en cada nodo en este archivo, y los comentarios asociados.

Parece que no puedo encontrar una manera de conseguir esos comentarios. Yo era capaz de conseguir 'algunos' de ellos utilizando simplexml, pero no funcionó para el nodo raíz, y estaba actuando muy extraño ... algunos comentarios se ponen en su propio nodo, algunos otros fueron dejados como niño, y todos los comentarios se pusieron en el mismo nodo ... no estoy seguro de esto tiene sentido :) el punto es simplexml rompió la estructura de los comentarios y que no era bueno para mis necesidades.

¿Fue útil?

Solución

Puede utilizar XMLReader a leer a través de todos los nodos y extraiga los comentarios. He incluido algunos ejemplos de código para empezar, ya que sólo se saca los nodos, y no toma en cuenta donde El comentario es en el interior, por debajo o por encima de cualquier nodo XML.

$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

El resultado esperado es:

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

Así se tomarán sólo los valores de los comentarios (no el <!-- -->), así como espacios en blanco.

Otros consejos

simplexml es bueno para agarrar rápida de algo, pero tiene sus limitaciones. El analizador DOM utilizar en su lugar. O en este caso, tal vez uno basado en eventos (SAX o XmlReader).

Es muy sencillo si se utiliza XPath. El comment() función coincide con los comentarios. Por lo que el patrón

//comment()

busca todos los comentarios del documento.

En XSLT, para el patrón general donde el comentario anterior al elemento que está transformando, por ejemplo:.

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

tendrá que utilizar una plantilla como:

<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 -->
   ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top