working simplexmlelement simplexml_load_file not namespace leer error ejemplo con php simplexml domdocument

simplexmlelement - ¿Cuál es la diferencia entre las extensiones DOM y SimpleXML de PHP?



simplexmlelement php (5)

No estoy entendiendo por qué necesitamos 2 analizadores XML en PHP.

¿Alguien puede explicar la diferencia entre esos dos?


¿Qué DOMNodes pueden ser representados por SimpleXMLElement?

La mayor diferencia entre las dos bibliotecas es que SimpleXML es principalmente una sola clase: SimpleXMLElement . Por el contrario, la extensión DOM tiene muchas clases, la mayoría de ellas un subtipo de DOMNode .

Entonces, una pregunta central al comparar esas dos bibliotecas es ¿cuál de las muchas clases de ofertas de DOM puede ser representada por un SimpleXMLElement al final?

La siguiente es una tabla de comparación que contiene esos tipos DOMNode que son realmente útiles siempre que se trate de XML (tipos de nodos útiles). Su millaje puede variar, por ejemplo, cuando necesita lidiar con DTD, por ejemplo:

+-------------------------+----+--------------------------+-----------+ | LIBXML Constant | # | DOMNode Classname | SimpleXML | +-------------------------+----+--------------------------+-----------+ | XML_ELEMENT_NODE | 1 | DOMElement | yes | | XML_ATTRIBUTE_NODE | 2 | DOMAttr | yes | | XML_TEXT_NODE | 3 | DOMText | no [1] | | XML_CDATA_SECTION_NODE | 4 | DOMCharacterData | no [2] | | XML_PI_NODE | 7 | DOMProcessingInstruction | no | | XML_COMMENT_NODE | 8 | DOMComment | no | | XML_DOCUMENT_NODE | 9 | DOMDocument | no | | XML_DOCUMENT_FRAG_NODE | 11 | DOMDocumentFragment | no | +-------------------------+----+--------------------------+-----------+

  • [1] : SimpleXML abstrae los nodos de texto como el valor de cadena de un elemento (compare __toString ). Esto solo funciona bien cuando un elemento solo contiene texto, de lo contrario la información de texto puede perderse.
  • [2] : cada analizador XML puede expandir los nodos CDATA al cargar el documento. SimpleXML los amplía cuando la opción LIBXML_NOCDATA se usa con las funciones simplexml_load_* o el constructor . (La opción también funciona con DOMDocument::loadXML() )

Como muestra esta tabla, SimpleXML tiene interfaces realmente limitadas en comparación con DOM. Junto a los que están en la tabla, SimpleXMLElement también abstrae el acceso a los niños y las listas de atributos, así como proporciona recorrido a través de los nombres de los elementos (acceso a la propiedad), atributos (acceso a la matriz) y también es un Traversable iterando sus propios hijos (elementos o atributos) y que ofrece acceso de espacio de nombres a través de los métodos children() y attributes() .

Mientras toda esta interfaz mágica esté bien, sin embargo no se puede cambiar extendiendo desde SimpleXMLElement, tan mágico como es, por limitado que sea.

Para averiguar qué tipo de nodo representa un objeto SimpleXMLElement, consulte:

  • ¿Cómo separar los objetos SimpleXML que representan elemento y atributo?

DOM sigue aquí las especificaciones DOMDocument Core Level 1 . Puedes hacer casi todos los manejos de XML imaginables con esa interfaz. Sin embargo, es solo el nivel 1, por lo que en comparación con los modernos niveles DOMDocument como 3, es algo limitado para algunas cosas más geniales. Seguro SimpleXML también ha perdido aquí.

SimpleXMLElement permite lanzar subtipos. Esto es muy especial en PHP. DOM permite esto también, aunque es un poco más de trabajo y se necesita elegir un tipo de nodo más específico.

XPath 1.0 es compatible con ambos, el resultado en SimpleXML es una array de elementos SimpleXMLElements , en DOM una DOMNodelist .

SimpleXMLElement admite conversión a cadena y matriz (json), las clases DOMNode en DOM no. Ofrecen conversión a matriz, pero solo como cualquier otro objeto (propiedades públicas como claves / valores).

Los patrones de uso comunes de esas dos extensiones en PHP son:

  • Normalmente comienza a usar SimpleXMLElement. Su nivel de conocimiento sobre XML y XPath se encuentra en un nivel igualmente bajo.
  • Después de luchar con la magia de sus interfaces, tarde o temprano se alcanza cierto nivel de frustración.
  • Descubres que puedes importar SimpleXMLElement en DOM y viceversa. Aprende más sobre DOM y cómo usar la extensión para hacer cosas que no pudiste (o no pudiste saber cómo) hacer con SimpleXMLElement .
  • Observa que puede cargar documentos HTML con la extensión DOM. Y XML no válido. Y haz formato de salida. Cosas que SimpleXMLElement simplemente no puede hacer. Ni siquiera con los trucos sucios.
  • Probablemente incluso cambie a la extensión DOM completamente porque al menos usted sabe que la interfaz es más diferenciada y le permite hacer cosas. También puede ver un beneficio en el aprendizaje del Nivel DOM 1 porque puede usarlo también en Javascript y en otros idiomas (una gran ventaja de la extensión DOM para muchos).

Puedes divertirte con ambas extensiones y creo que deberías saber ambas cosas. Mientras más, mejor. Todas las extensiones basadas en libxml en PHP son extensiones muy buenas y potentes. Y en bajo la etiqueta php existe una buena tradición para cubrir bien estas bibliotecas y también con información detallada.


Como han señalado otros, las extensiones DOM y SimpleXML no son estrictamente "analizadores XML", sino que son interfaces diferentes a la estructura generada por el analizador subyacente libxml2.

La interfaz SimpleXML trata XML como una estructura de datos serializada, de la misma manera que trataría una cadena JSON decodificada. Por lo tanto, proporciona un acceso rápido a los contenidos de un documento, con énfasis en acceder a los elementos por su nombre, y leer sus atributos y contenido de texto (incluido el plegado automático en entidades y secciones CDATA). Admite documentos que contienen múltiples espacios de nombres (principalmente utilizando los métodos children() y attributes() ), y puede buscar un documento utilizando una expresión XPath. También incluye soporte para la manipulación básica del contenido, por ejemplo, agregar o sobreescribir elementos o atributos con una nueva cadena.

La interfaz DOM, por otro lado, trata XML como un documento estructurado, donde la representación utilizada es tan importante como los datos representados. Por lo tanto, proporciona un acceso mucho más granular y explícito a diferentes tipos de "nodos", como entidades y secciones CDATA, así como a algunos que SimpleXML ignora, como los comentarios y las instrucciones de procesamiento. También proporciona un conjunto mucho más rico de funciones de manipulación, lo que le permite reorganizar los nodos y elegir cómo representar el contenido de texto, por ejemplo. El intercambio es una API bastante compleja, con una gran cantidad de clases y métodos; ya que implementa una API estándar (originalmente desarrollada para manipular HTML en JavaScript), puede haber menos sensación de "PHP natural", pero algunos programadores pueden estar familiarizados con ella desde otros contextos.

Ambas interfaces requieren que el documento completo se analice en la memoria, y que terminen de forma efectiva los punteros en esa representación analizada; incluso puede alternar entre las dos envolturas con simplexml_import_dom() y dom_import_simplexml() , por ejemplo, para agregar una característica "faltante" a SimpleXML usando una función de la DOM API. Para documentos más grandes, el XMLReader "basado en la extracción" o el analizador XML "basado en eventos" pueden ser más apropiados.


En una palabra:

SimpleXml

  • es para XML Simple y / o Simple UseCases
  • API limitada para trabajar con nodos (p. ej. no se puede programar tanto a una interfaz)
  • todos los nodos son del mismo tipo (elemento nodo es lo mismo que atributo nodo)
  • los nodos son mágicamente accesibles, por ejemplo $root->foo->bar[''attribute'']

DOM

  • es para cualquier XML UseCase que pueda tener
  • es una implementación de W3C DOM API (se encuentra implementada en muchos idiomas)
  • diferencia entre varios tipos de nodos (más control)
  • mucho más prolijo debido a la API explícita (puede codificar a una interfaz)
  • puede analizar HTML roto
  • le permite usar funciones PHP en consultas XPath

Ambos están basados ​​en libxml y pueden ser influenciados hasta cierto punto por las funciones libxml

Personalmente , no me gusta demasiado SimpleXml. Eso es porque no me gusta el acceso implícito a los nodos, por ejemplo $foo->bar[1]->baz[''attribute''] . Vincula la estructura XML real a la interfaz de programación. El tipo de un nodo para todo también es poco intuitivo porque el comportamiento de SimpleXmlElement cambia mágicamente según sus contenidos.

Por ejemplo, cuando tiene <foo bar="1"/> el volcado de objetos de /foo/@bar será idéntico al de /foo pero al hacer un eco de ellos se imprimirán resultados diferentes. Además, debido a que ambos son elementos de SimpleXml, puede llamar a los mismos métodos, pero solo se aplicarán cuando SimpleXmlElement lo admita, por ejemplo, intentar hacer $el->addAttribute(''foo'', ''bar'') en el primer SimpleXmlElement no hará nada. Ahora, por supuesto, es correcto que no se puede agregar un atributo a un nodo de atributo, pero el punto es que un nodo de atributo no expondrá ese método en primer lugar.

Pero eso es solo mi 2c. Haga su propia opinión :)

En una nota al margen , no hay dos analizadores, sino un par más en PHP . SimpleXml y DOM son solo los dos que analizan un documento en una estructura de árbol. Los otros son analizadores / lectores / escritores basados ​​en eventos o basados ​​en eventos.

También vea mi respuesta a


SimpleXML es, como nombre indica, un analizador simple para contenido XML, y nada más. No puede analizar, digamos contenido html estándar. Es fácil y rápido, y por lo tanto una gran herramienta para crear aplicaciones simples.

La extensión DOM, en el otro lado, es mucho más poderosa. Le permite analizar casi cualquier documento DOM, incluidos html, xhtml, xml. Le permite abrir, escribir e incluso corregir el código de salida, admite xpath y, en general, más manipulación. Por lo tanto, su uso es mucho más complicado, porque la biblioteca es bastante compleja, y eso la convierte en una herramienta perfecta para proyectos más grandes donde se necesita una gran manipulación de datos.

Espero que responda tu pregunta :)


Voy a hacer la respuesta más corta posible para que los principiantes puedan quitársela fácilmente. También estoy simplificando ligeramente las cosas por el bien de la brevedad. Salta al final de esa respuesta para la versión exagerada de TL; DR.

DOM y SimpleXML no son en realidad dos analizadores diferentes . El analizador real es libxml , que es utilizado internamente por DOM y SimpleXML. Así que DOM / SimpleXML son solo dos formas de usar el mismo analizador y proporcionan formas de convertir un objeto a another .

SimpleXML tiene la intención de ser muy simple, por lo que tiene un pequeño conjunto de funciones y se enfoca en leer y escribir datos . Es decir, puede leer o escribir fácilmente un archivo XML, puede actualizar algunos valores o eliminar algunos nodos (¡ con algunas limitaciones! ), Y eso es todo. Sin manipulación sofisticada , y no tiene acceso a los tipos de nodos menos comunes. Por ejemplo, SimpleXML no puede crear una sección CDATA aunque puede leerlos.

DOM ofrece una implementación completa del DOM más un par de métodos no estándar como appendXML . Si está acostumbrado a manipular DOM en Javascript, encontrará exactamente los mismos métodos en el DOM de PHP. Básicamente no hay limitaciones en lo que puedes hacer y unifica maneja HTML. El otro lado de esta riqueza de características es que es más complejo y más detallado que SimpleXML.

Nota al margen

La gente a menudo se pregunta qué extensión deberían usar para manejar su contenido XML o HTML. En realidad, la elección es fácil porque no hay muchas opciones para comenzar:

  • si necesita tratar con HTML, realmente no tiene otra opción: debe usar DOM
  • si tiene que hacer algo sofisticado, como mover nodos o anexar XML sin formato, de nuevo tendrá que usar DOM
  • si todo lo que necesita hacer es leer y / o escribir algunos XML básicos (por ejemplo, intercambiando datos con un servicio XML o leyendo un canal RSS), puede usar cualquiera de ellos. O another .
  • si su documento XML es tan grande que no cabe en la memoria, no puede usar ninguno y tiene que usar XMLReader que también está basado en libxml2, es aún más molesto de usar, pero aún funciona bien con los demás

TL; DR

  • SimpleXML es súper fácil de usar, pero solo es bueno para el 90% de los casos de uso.
  • DOM es más complejo, pero puede hacer todo.
  • XMLReader es muy complicado, pero usa muy poca memoria. Muy situacional.