Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

327
Vistas
¿Por qué lxml.etree.SubElement() permite crear elementos que no son serializables?
from lxml import etree element1 = etree.Element('{j:a}a', nsmap={None: 'j:a'}) etree.SubElement(element1, 'b') element2 = etree.Element('{j:a}a', nsmap={None: 'j:a'}) etree.SubElement(element2, '{j:a}b')

ambos elementos se serializan al mismo

<a xmlns="j:a"><b/></a>

pero ambos elementos no se comportan igual

element1.find('b') -> devuelve el Elemento

element2.find('b') -> devuelve Ninguno

si lo haces al revés

etree.fromstring("<a xmlns="j:a"><b/></a>")

obtienes la representación del elemento 2, entonces

element2.find('b') -> devuelve Ninguno

lo que parece coherente porque no hay <b/> sin espacio de nombres en el árbol, porque <b/> hereda el espacio de nombres predeterminado de <a/>

Entonces, ¿cuál es el propósito de la representación en el elemento 1? Parece agregar un subelemento sin espacio de nombres <b/> y se comporta de esa manera. Pero cuando se serializa, el elemento hereda de <a> .

¿Por qué existe esto si no se serializa de todos modos?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Todo se reduce a los espacios de nombres

Las etiquetas xml pueden (pero no deben) tener un espacio de nombres. Entonces, incluso si el nodo raíz define un espacio de nombres predeterminado, los nodos secundarios pueden no tener un espacio de nombres, lo que no es equivalente a estar en el espacio de nombres predeterminado.

Esta es la diferencia entre su element1 y element2 : el element1 de elemento1 no tiene espacio de nombres; El subelemento de element2 está en el espacio de nombres predeterminado, ya que cuando lo crea, especifica el espacio de nombres predeterminado. Si intentas

element2.find("{j:l}b")) -> devuelve el elemento b , o para ser más exactos, el elemento {j:a}b .

Así que sí, el espacio de nombres importa. Y cuando crea los elementos con lxml, puede definir elementos sin espacio de nombres: simplemente no lo agregue.

Pero, ¿qué pasa con la serialización?

Ahora bien, no soy un experto en lxml, por lo que esta es solo mi conjetura sobre el punto. La cosa es que cuando serializas el elemento, no hay forma de discriminar entre los elementos que realmente no tienen espacio de nombres y el elemento en el espacio de nombres predeterminado, por lo que se representan de la misma manera.

En consecuencia, serializar un elemento y luego analizarlo nuevamente, no puede dar el resultado original. Si por ejemplo, usando tu element1 haces:

 sel1 = etree.tostring(element1) element1s = etree.fromstring(sel1)

Resulta que element1s no es igual a element1 , porque el subelemento b ahora es el subelemento {j:a}b . Al analizar la cadena, los elementos sin espacio de nombres se agregan al espacio de nombres predeterminado.

Conclusión

Ahora, no sé si esto es intencionado o es un error. Que yo sepa, si un documento XML declara un espacio de nombres predeterminado, todos los elementos que no tengan explícitamente un espacio de nombres diferente deben considerarse en el espacio de nombres predeterminado. Como sucede cuando analiza un documento xml con la función fromstring . Puede tener "sin espacio de nombres" solo si no se declara ningún espacio de nombres predeterminado.
Entonces, en mi opinión, su subelemento b de element1 debería "heredar" el espacio de nombres del nodo principal, ya que el nodo principal define un espacio de nombres predeterminado con nsmap={None: "j:a"} .
Pero también se le podría decir que, dado que está creando el documento con elementos lxml, es su responsabilidad colocar cada elemento en el espacio de nombres correcto, lo que significa que debe agregar el espacio de nombres predeterminado explícitamente.

Dado que xml permite elementos sin espacios de nombres en algunas circunstancias, lxml no se queja cuando un elemento no tiene un espacio de nombres.
Creo que la adición automática de los espacios de nombres predeterminados al subelemento de los elementos que declaran un espacio de nombres predeterminado sería una característica interesante, pero simplemente no está allí.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda