{"id":36982511,"url":"https://github.com/phpcfdi/cfdi-to-json","last_synced_at":"2026-01-13T22:52:26.915Z","repository":{"id":42466595,"uuid":"335505922","full_name":"phpcfdi/cfdi-to-json","owner":"phpcfdi","description":"Herramienta para convertir archivos CFDI a JSON","archived":false,"fork":false,"pushed_at":"2025-11-02T21:38:38.000Z","size":171,"stargazers_count":31,"open_issues_count":0,"forks_count":9,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-11-02T23:12:22.471Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phpcfdi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-03T04:22:56.000Z","updated_at":"2025-11-02T21:33:07.000Z","dependencies_parsed_at":"2024-01-10T18:52:59.031Z","dependency_job_id":"2b5596d2-9607-4669-9fa0-bd4a4eb0ec31","html_url":"https://github.com/phpcfdi/cfdi-to-json","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/phpcfdi/cfdi-to-json","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fcfdi-to-json","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fcfdi-to-json/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fcfdi-to-json/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fcfdi-to-json/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phpcfdi","download_url":"https://codeload.github.com/phpcfdi/cfdi-to-json/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fcfdi-to-json/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28402192,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-13T22:52:26.806Z","updated_at":"2026-01-13T22:52:26.905Z","avatar_url":"https://github.com/phpcfdi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# phpcfdi/cfdi-to-json\n\n[![Source Code][badge-source]][source]\n[![Packagist PHP Version Support][badge-php-version]][php-version]\n[![Discord][badge-discord]][discord]\n[![Latest Version][badge-release]][release]\n[![Software License][badge-license]][license]\n[![Build Status][badge-build]][build]\n[![Reliability][badge-reliability]][reliability]\n[![Maintainability][badge-maintainability]][maintainability]\n[![Code Coverage][badge-coverage]][coverage]\n[![Violations][badge-violations]][violations]\n[![Total Downloads][badge-downloads]][downloads]\n\n\u003e Herramienta para convertir archivos CFDI a JSON\n\n## Acerca de `phpcfdi/cfdi-to-json`\n\nEsta es una herramienta que sigue sus propias convenciones para convertir los archivos de CFDI (XML de SAT)\na formato JSON.\n\nAlgunas de las convenciones que se siguen son:\n\n- Los elementos son objetos que contienen su valor, los atributos y sus elementos hijos.\n- Los elementos que pueden aparecer más de una vez, son manejados como arreglos.\n- La librería guarda un registro interno de los elementos que pueden aparecer más de una vez.\n\n## Instalación\n\nUsa [composer](https://getcomposer.org/)\n\n```shell\ncomposer require phpcfdi/cfdi-to-json\n```\n\n## Uso básico\n\n### Convirtiendo de CFDI (string) a JSON (string)\n\n```php\n\u003c?php\ndeclare(strict_types=1);\n\nuse PhpCfdi\\CfdiToJson\\JsonConverter;\n\n$contents = file_get_contents('mi-archivo-xfdi.xml');\n$json = JsonConverter::convertToJson($contents);\necho $json;\n```\n\n### Convirtiendo de `DOMDocument` a `array`\n\n```php\n\u003c?php\ndeclare(strict_types=1);\n\nuse PhpCfdi\\CfdiToJson\\Factory;\n\n/** @var DOMDocument $document */\n\n$factory = new Factory();\n$dataConverter = $factory-\u003ecreateConverter();\n$rootNode = $dataConverter-\u003econvertXmlDocument($document);\n$array = $rootNode-\u003etoArray();\n\nvar_export($array);\n```\n\n### Ejemplo de salida\n\nNote que: \n- `Emisor` parece una propiedad más del objeto principal, pero el contenido es un objeto y no una cadena de caracteres.\n- `Concepto` contiene un arreglo de objetos, cada uno es una representación de un nodo concepto.\n- `Traslado` contiene un arreglo a pesar de que solo contenga un objeto, se conoce que es múltiple.\n- `Complemento` es un arreglo a pesar de lo definido en el Anexo 20 porque el XSD dice que puede tener múltiples apariciones.\n\n```json\n{\n    \"Certificado\": \"MIIGH...imAyX\",\n    \"CondicionesDePago\": \"CONTADO\",\n    \"Fecha\": \"2018-01-12T08:15:01\",\n    \"Folio\": \"11541\",\n    \"FormaPago\": \"04\",\n    \"LugarExpedicion\": \"76802\",\n    \"MetodoPago\": \"PUE\",\n    \"Moneda\": \"MXN\",\n    \"NoCertificado\": \"00001000000401220451\",\n    \"Sello\": \"Xt7tK...gdg==\",\n    \"Serie\": \"H\",\n    \"SubTotal\": \"1709.12\",\n    \"TipoDeComprobante\": \"I\",\n    \"Total\": \"2010.01\",\n    \"Version\": \"3.3\",\n    \"xsi:schemaLocation\": \"http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd\",\n    \"Emisor\": {\n        \"Nombre\": \"PROMOTORA OTIR SA DE CV\",\n        \"RegimenFiscal\": \"601\",\n        \"Rfc\": \"POT9207213D6\"\n    },\n    \"Receptor\": {\n        \"Nombre\": \"DAY INTERNATIONAL DE MEXICO SA DE CV\",\n        \"Rfc\": \"DIM8701081LA\",\n        \"UsoCFDI\": \"G03\"\n    },\n    \"Conceptos\": {\n        \"Concepto\": [\n            {\n                \"Cantidad\": \"2.00\",\n                \"ClaveProdServ\": \"90111501\",\n                \"ClaveUnidad\": \"E48\",\n                \"Descripcion\": \"Paquete\",\n                \"Importe\": \"1355.67\",\n                \"Unidad\": \"UNIDAD DE SERVICIO\",\n                \"ValorUnitario\": \"677.83\",\n                \"Impuestos\": {\n                    \"Traslados\": {\n                        \"Traslado\": [\n                            {\n                                \"Base\": \"1355.67\",\n                                \"Importe\": \"216.91\",\n                                \"Impuesto\": \"002\",\n                                \"TasaOCuota\": \"0.160000\",\n                                \"TipoFactor\": \"Tasa\"\n                            }\n                        ]\n                    }\n                }\n            },\n            {\n                \"Cantidad\": \"1.00\",\n                \"ClaveProdServ\": \"90101501\",\n                \"ClaveUnidad\": \"E48\",\n                \"Descripcion\": \"Restaurante\",\n                \"Importe\": \"353.45\",\n                \"Unidad\": \"UNIDAD DE SERVICIO\",\n                \"ValorUnitario\": \"353.45\",\n                \"Impuestos\": {\n                    \"Traslados\": {\n                        \"Traslado\": [\n                            {\n                                \"Base\": \"353.45\",\n                                \"Importe\": \"56.55\",\n                                \"Impuesto\": \"002\",\n                                \"TasaOCuota\": \"0.160000\",\n                                \"TipoFactor\": \"Tasa\"\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    },\n    \"Impuestos\": {\n        \"TotalImpuestosTrasladados\": \"273.46\",\n        \"Traslados\": {\n            \"Traslado\": [\n                {\n                    \"Importe\": \"273.46\",\n                    \"Impuesto\": \"002\",\n                    \"TasaOCuota\": \"0.160000\",\n                    \"TipoFactor\": \"Tasa\"\n                }\n            ]\n        }\n    },\n    \"Complemento\": [\n        {\n            \"ImpuestosLocales\": {\n                \"TotaldeRetenciones\": \"0.00\",\n                \"TotaldeTraslados\": \"27.43\",\n                \"version\": \"1.0\",\n                \"TrasladosLocales\": [\n                    {\n                        \"ImpLocTrasladado\": \"IH\",\n                        \"Importe\": \"27.43\",\n                        \"TasadeTraslado\": \"2.50\"\n                    }\n                ]\n            },\n            \"TimbreFiscalDigital\": {\n                \"FechaTimbrado\": \"2018-01-12T08:17:54\",\n                \"NoCertificadoSAT\": \"00001000000406258094\",\n                \"RfcProvCertif\": \"DCD090706E42\",\n                \"SelloCFD\": \"Xt7tK...gdg==\",\n                \"SelloSAT\": \"IRy7w...6Zg==\",\n                \"UUID\": \"CEE4BE01-ADFA-4DEB-8421-ADD60F0BEDAC\",\n                \"Version\": \"1.1\",\n                \"xsi:schemaLocation\": \"http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd\"\n            }\n        }\n    ]\n}\n```\n\n## Funcionamiento interno\n\nLa conversión parte de un objeto `DOMDocument` que es recorrido nodo a nodo y en cada transformación genera\nun objeto de tipo `Nodes\\Node` que contiene sus propiedades básicas de nombre, ruta, valor de texto, atributos e hijos.\nLos hijos (`Nodes\\Children`) son una colección de nodos `Nodes\\Node`.\n\nAl momento de exportar a un arreglo `Nodes\\Node::toArray()` es cuando se resuelve si los nodos deben agregarse como\nllaves directas a objetos, o bien, como arreglos de objetos. \n\n### Elementos con múltiples apariciones\n\nPara detectar los elementos con múltiples apariciones esta librería contiene un archivo `src/UnboundedOccursPaths.json`\ncon el listado de rutas de elementos que pueden aparecer más de una vez.\n\nEste listado se puede generar utilizando el archivo `bin/max-occurs-paths.php`, que descargará el registro de espacios\nde nombres del SAT de PhpCfdi [`phpcfdi/sat-ns-registry`](https://github.com/phpcfdi/sat-ns-registry) así como todos\nlos archivos XSD para interpretar las rutas que contienen `maxOccurs=\"unbounded\"`.\n\nDesde 2021-03-22 se ha agregado un evento desde `phpcfdi/sat-ns-registry` para que notifique a este mismo repositorio\nque el registro de espacios de nombres cambió.\n\n### Nodos con texto\n\nEl texto o valor que contenga algún nodo XML es exportado a una llave de cadena vacía en el JSON resultante.\nPor ejemplo, el siguiente XML:\n\n```xml\n\u003cdetallista:orderIdentification\u003e\n    \u003cdetallista:referenceIdentification type=\"ON\"\u003e3\u003c/detallista:referenceIdentification\u003e\n\u003c/detallista:orderIdentification\u003e\n```\n\nGenera el siguiente JSON:\n\n```json\n{\n  \"orderIdentification\": {\n    \"referenceIdentification\": {\n      \"\": \"3\",\n      \"type\": \"ON\"\n    }\n  }\n}\n```\n\n## Soporte\n\nPuedes obtener soporte abriendo un ticket en Github.\n\nAdicionalmente, esta librería pertenece a la comunidad [PhpCfdi](https://www.phpcfdi.com), así que puedes usar los\nmismos canales de comunicación para obtener ayuda de algún miembro de la comunidad.\n\n## Compatibilidad\n\nEsta librería se mantendrá compatible con al menos la versión con\n[soporte activo de PHP](https://www.php.net/supported-versions.php) más reciente.\n\nTambién utilizamos [Versionado Semántico 2.0.0](docs/SEMVER.md) por lo que puedes usar esta librería\nsin temor a romper tu aplicación.\n\n## Contribuciones\n\nLas contribuciones con bienvenidas. Por favor, revisa [CONTRIBUTING][] para más detalles\ny recuerda revisar el archivo de tareas pendientes [TODO][] y el archivo [CHANGELOG][].\n\n## Copyright and License\n\nThe `phpcfdi/cfdi-to-json` library is copyright © [PhpCfdi](https://www.phpcfdi.com/)\nand licensed for use under the MIT License (MIT). Please see [LICENSE][] for more information.\n\n[contributing]: https://github.com/phpcfdi/cfdi-to-json/blob/main/CONTRIBUTING.md\n[changelog]: https://github.com/phpcfdi/cfdi-to-json/blob/main/docs/CHANGELOG.md\n[todo]: https://github.com/phpcfdi/cfdi-to-json/blob/main/docs/TODO.md\n\n[source]: https://github.com/phpcfdi/cfdi-to-json\n[php-version]: https://packagist.org/packages/phpcfdi/cfdi-to-json\n[discord]: https://discord.gg/aFGYXvX\n[release]: https://github.com/phpcfdi/cfdi-to-json/releases\n[license]: https://github.com/phpcfdi/cfdi-to-json/blob/main/LICENSE\n[build]: https://github.com/phpcfdi/cfdi-to-json/actions/workflows/build.yml?query=branch:main\n[reliability]:https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-to-json\u0026metric=Reliability\n[maintainability]: https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-to-json\u0026metric=Maintainability\n[coverage]: https://sonarcloud.io/component_measures?id=phpcfdi_cfdi-to-json\u0026metric=Coverage\n[violations]: https://sonarcloud.io/project/issues?id=phpcfdi_cfdi-to-json\u0026resolved=false\n[downloads]: https://packagist.org/packages/phpcfdi/cfdi-to-json\n\n[badge-source]: https://img.shields.io/badge/source-phpcfdi/cfdi--to--json-blue?logo=github\n[badge-discord]: https://img.shields.io/discord/459860554090283019?logo=discord\n[badge-php-version]: https://img.shields.io/packagist/php-v/phpcfdi/cfdi-to-json?logo=php\n[badge-release]: https://img.shields.io/github/release/phpcfdi/cfdi-to-json?logo=git\n[badge-license]: https://img.shields.io/github/license/phpcfdi/cfdi-to-json?logo=open-source-initiative\n[badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/cfdi-to-json/build.yml?branch=main\u0026logo=github-actions\n[badge-reliability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_cfdi-to-json\u0026metric=reliability_rating\n[badge-maintainability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_cfdi-to-json\u0026metric=sqale_rating\n[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_cfdi-to-json/main?logo=sonarqubecloud\u0026server=https%3A%2F%2Fsonarcloud.io\n[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_cfdi-to-json/main?format=long\u0026logo=sonarqubecloud\u0026server=https%3A%2F%2Fsonarcloud.io\n[badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/cfdi-to-json?logo=packagist\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcfdi%2Fcfdi-to-json","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphpcfdi%2Fcfdi-to-json","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcfdi%2Fcfdi-to-json/lists"}