Ruby 使用Nokogiri验证XML:查找验证错误的行数?

Ruby 使用Nokogiri验证XML:查找验证错误的行数?,ruby,xml,validation,nokogiri,Ruby,Xml,Validation,Nokogiri,我试图根据XSD模式验证相当大的XML文件。Nokogiri使用以下代码实现了这一点: xsd = Nokogiri::XML::Schema(File.read('batch_schema.xsd')) doc = Nokogiri::XML(File.read('batch205.xml')) xsd.validate(doc).each do |error| puts "#{error.line} :: #{error.message}" end 很简单。仅限:

我试图根据XSD模式验证相当大的XML文件。Nokogiri使用以下代码实现了这一点:

  xsd = Nokogiri::XML::Schema(File.read('batch_schema.xsd'))
  doc = Nokogiri::XML(File.read('batch205.xml'))

  xsd.validate(doc).each do |error|
    puts "#{error.line} :: #{error.message}"
  end
很简单。仅限:
错误。行
始终为65535。因为我们需要检查的XML文件非常庞大,所以获取行号将非常非常有帮助

我发现了这一点,因此我找到了阅读这一行的选项


在libxml2文档中,我发现必须为其设置行号。知道如何使用Nokogiri启用行号或在验证错误中获取行号吗

我只需要编写一些不同的代码,而不是预先加载和解析整个xml,我只需要验证文件本身。像这样:

xsd = Nokogiri::XML::Schema(File.read('batch_schema.xsd'))

xsd.validate('batch205.xml').each do |error|
  puts "#{error.line} :: #{error.message}"
end

我只是需要编写一些不同的代码,而不是预先加载和解析整个xml,我只需要验证文件本身。像这样:

xsd = Nokogiri::XML::Schema(File.read('batch_schema.xsd'))

xsd.validate('batch205.xml').each do |error|
  puts "#{error.line} :: #{error.message}"
end

随libxml2提供,可以处理大型文件,并根据XSD对其进行验证。Nokogiri将把整个“巨大的”XML文件读入内存,而内存是不可伸缩的,因此您可能希望查看xmlint.Nope,这不再是事实。如果给定一个文件,它将检查该文件,而不会将其完全加载到内存中。
file.read('batch205.xml')
将导致将整个文件读入内存,具体如下:“打开该文件,可选择地查找给定的偏移量,然后返回长度字节(默认为文件的其余部分)。”。生成的字符串将传递给Nokogiri。默认情况下,Nokogiri读取文档并将其解析为DOM,这要求整个树都在内存中。使用Nokogiri::XML::SAX逐节点解析文档将更像您所说的。好的观点!如果我只写文件名,它将不会加载整个文件。无论如何:这不是问题,也根本不是问题。它在<25秒内验证文件,我只需要一个带有验证错误的行号。OMG@theTinMan完全是这样!如果我只给验证文件名,不仅更快,而且行nrs和列现在都正确了!谢谢你的提示。随libxml2提供,可以处理大型文件,并根据XSD对其进行验证。Nokogiri将把整个“巨大的”XML文件读入内存,而内存是不可伸缩的,因此您可能希望查看xmlint.Nope,这不再是事实。如果给定一个文件,它将检查该文件,而不会将其完全加载到内存中。
file.read('batch205.xml')
将导致将整个文件读入内存,具体如下:“打开该文件,可选择地查找给定的偏移量,然后返回长度字节(默认为文件的其余部分)。”。生成的字符串将传递给Nokogiri。默认情况下,Nokogiri读取文档并将其解析为DOM,这要求整个树都在内存中。使用Nokogiri::XML::SAX逐节点解析文档将更像您所说的。好的观点!如果我只写文件名,它将不会加载整个文件。无论如何:这不是问题,也根本不是问题。它在<25秒内验证文件,我只需要一个带有验证错误的行号。OMG@theTinMan完全是这样!如果我只给验证文件名,不仅更快,而且行nrs和列现在都正确了!谢谢你的提示。