Página 1 de 1

Eliminar nodo de XML

NotaPublicado: 2014-11-13 13:09 @589
por sarriaga
Hola, ¿qué tal? De nuevo me dirijo a ustedes ya que he comenzado a trabajar con archivos XML y tengo un ligero problema... Verán, desde el navegador obtengo un archivo XML el cual valido, pero me arroja errores cuando trata de validar XML con addenda. Si el XML tiene estructura simple la valida sin problemas y se puede guardar en la base de datos. Mi teoría es que posiblemente el módulo que utilizo no valida XML con addenda...

¿Existe algún otro modo de validarlo con la estructura que menciono o podría eliminar la addenda del XML y después validarlo?

Tengo problemas para eliminar el nodo addenda y sus dependencias. Estoy utilizando XML::Simple, XML::LibXML y XML::Twig para manipular y acceder a la información del XML. He leído que podría eliminar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use XML::Simple;
  2. require XML::LibXML;
  3. use XML::Twig;
  4. use Data::Dumper;
  5. use DBI;
  6. use strict;
  7.  
  8.  
  9. my $xml_info = XML::Simple->new->XMLin('../xmlData/tst.xml');
  10. $xml->validation(XML::LibXML->new->parse_file('../xmlData/tst.xml');
  11.  
  12. my $addenda = $xml_info->{'cfdi:Addenda'};      ## eliminar este nodo del xml original
  13. ## utilice lo siguiente; no lo hace como necesito
  14. #my $addenda = delete($xml_info->{'cfdi:Addenda'});
  15.  
  16. print Dumper $xml_info;
  17.  
  18.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Espero puedan orientarme.

Saludos

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-13 20:51 @910
por explorer
Utilizar tres bibliotecas para una misma misión, es una locura.

De las tres que ofreces, me quedaría con XML::Twig. Leer el documento, interpretarlo, borrar lo que quieres con el método delete(), y luego pintar el resultado con print().

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-14 11:25 @517
por sarriaga
Bien, ya estoy revisando... tengo una duda más... ¿¿Existe alguna librería que valide la Addenda?? Ya que un xml simple no lo contiene, y al utilizar la librería XML::LibXML me genera un error y dice que el xml no es válido, pero el problema es que sí lo es, ya que está certificado.

Utilizo la siguiente instrucción para validar el xml:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $XML_TEMP =  './temp.xml';
  2.  
  3. eval {$schema->validate(XML::LibXML->new->parse_file($XML_TEMP))};
  4. return 'El documento XML no es valido: '.$@ if $@;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y en el navegador genera el siguiente mensaje:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. El documento XML no es valido: ./temp.xml:0: Schemas validity error : Element '{http://boveda.misfacturas.net/schema}Comentario': No matching global element declaration available, but demanded by the strict wildcard.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé si este error lo genera por que contiene addenda, ya que "sospechosamente" todos mis xml que la contienen generan ese error y los xml sin ella, los valida correctamente. Me siento perdida :?

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-14 22:07 @963
por explorer
¿Y no será que el scheme no corresponde al formato de ese nodo extra?

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-18 08:49 @409
por sarriaga
En ésta parte del esquema le indico que puede existir... o tal vez me falte alguna configuración en este archivo :/

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <xs:element name="Addenda" minOccurs="0">
  2.   <xs:annotation>
  3.      <xs:documentation>Nodo opcional para recibir las extensiones al presente formato que  sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato de origen.</xs:documentation>
  4.   </xs:annotation>
  5.   <xs:complexType>
  6.      <xs:sequence>
  7.         <xs:any minOccurs="0" maxOccurs="unbounded"/>
  8.      </xs:sequence>
  9.   </xs:complexType>
  10. </xs:element>
  11.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Voy a seguir revisando, posiblemente algo me esté faltando.

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-18 09:08 @422
por explorer
Element '{http://boveda.misfacturas.net/schema}Comentario': No matching global element declaration available, but demanded by the strict wildcard.

El error dice que el problema está en la marca Comentario: que el esquema dice que es obligatorio, pero no aparece en el XML.

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-20 09:02 @418
por sarriaga
En el schema le importo el URL de la addenda para que se valide ahí pero no realiza la validación, ¿puede que esté importando de manera incorrecta?

schema_cfdi.xsd
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <xs:schema xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sat.gob.mx/cfd/3" elementFormDefault="qualified" attributeFormDefault="unqualified">
  2.  <xs:import xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" schemaLocation="TimbreFiscalDigital.xsd"/>
  3. <xs:import xmlns:xsi="https://boveda.misfacturas.net/schema" schemaLocation="AddendaMfn.xsd"/>
  4.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Con el schema anterior intento validar el siguiente xml original que contiene la addenda:
fact_test.xml
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. - <cfdi:Addenda>
  2.   <mfn:Comentario xmlns:mfn="http://boveda.misfacturas.net/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://boveda.misfacturas.net/schema https://boveda.misfacturas.net/AddendaMfn.xsd">REQUISICION DE COMPRA Y/O SERVICIOS FOLIO 000011</mfn:Comentario>
  3.   </cfdi:Addenda>
  4.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿¿Puede ser que el AddendaMfn.xsd no contenga el elemento que menciona el error??

Re: Eliminar nodo de XML

NotaPublicado: 2014-11-20 09:13 @425
por explorer
https://boveda.misfacturas.net/AddendaMfn.xsd:

Estado HTTP 404 - /AddendaMfn.xsd

type Informe de estado

mensaje /AddendaMfn.xsd

descripción: El recurso requerido (/AddendaMfn.xsd) no está disponible.