R:如何解析CFDi XML文档

时间:2016-10-21 19:02:32

标签: r xml xml-parsing

我刚开始使用R.我正在尝试解析CFDi XML文档。 CFDi是电子发票的墨西哥标准。我尝试过XML库正常解析过程但没有成功:

library(XML)
xmlurl <- "CFDi.xml"
xmlfile <- xmlTreeParse(xmlurl)
xmltop <- xmlRoot(xmlfile)
xmltable <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue))

我的xmltable最终是一个值列表而不是数据矩阵:

$Emisor
$Emisor$DomicilioFiscal
character(0)

$Emisor$ExpedidoEn
character(0)

$Emisor$RegimenFiscal
character(0)


$Receptor
$Receptor$Domicilio
character(0)


$Conceptos
$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)

$Conceptos$Concepto
character(0)


$Impuestos
Traslados 
       "" 

$Complemento
$Complemento$TimbreFiscalDigital
character(0)

我想我的错误与XML的架构有关但不确定。这是CFDi.xml文件(https://dl.dropboxusercontent.com/u/2736898/CFDi.xml)。谢谢。

2 个答案:

答案 0 :(得分:0)

您的代码是正确的,但在这种情况下它不起作用,因为您提供的XML文件没有要提取的值。

文件的标签中没有值,但只有xmlValue的属性才会返回值。

此外,标签名称有点棘手,因为它们内部有一个冒号。

这里有一些例子:

此cose的最后一个侦听允许您查看标记名称。

 xmlfile <- xmlTreeParse(xmlurl, useInternalNodes = T)
 xmltop <- xmlRoot(xmlfile)
 names_file <- xmlSApply(xmltop, xmlName, full = TRUE)
 names_file
            Emisor           Receptor          Conceptos          Impuestos 
     "cfdi:Emisor"    "cfdi:Receptor"   "cfdi:Conceptos"   "cfdi:Impuestos" 
       Complemento 
"cfdi:Complemento" 

假设我们要提取cfdi的所有值(属性):Impuestos:

 xml_impuest <- xpathApply(xmltop, "cfdi:Impuestos", xmlAttrs)
 xml_impuest
[[1]]
totalImpuestosTrasladados 
             "207.440000" 

您可以看到的广告,&#34; Impuestos&#34;只有一个属性。

最好定义如何解析什么和&#34;什么&#34;有&#34;什么&#34;在属性方面,并编写精确的xPath查询来调查您的数据(使用xpathApply)。

答案 1 :(得分:0)

通过使用为您制作CFDI的服务,您可以节省大量工作:www.facturapi.io

您可以使用Facturapi以几乎相同的价格生成整个发票,而不是仅仅为&#34; timbrado&#34;使用服务。

(免责声明:我是FacturAPI的作者)