如何在 ruby​​ 中清理格式错误的 xml

2024-01-09

我在整理从以下网站返回的格式错误的 XML 代码时遇到问题SEC 的 edgar 数据库 http://www.sec.gov/edgar.shtml.

由于某种原因,他们形成了可怕的 xml。包含任何类型字符串的标签都不是封闭的,它实际上可以在其他标签内包含其他 xml 或 html 文档。通常我会这么做Tidy http://rubyforge.org/projects/tidy/但这并没有得到维护。

我尝试过使用 Nokogiri::XML::SAX::Parser 但这似乎令人窒息,因为标签未关闭。它似乎工作正常,直到它到达第一个结束标签,然后它不会再触发任何其他标签。但它正在吐出正确的字符。

  class Filing < Nokogiri::XML::SAX::Document
    def start_element name, attrs = []
      puts "starting: #{name}"
    end

    def characters str
      puts "chars: #{str}"
    end

    def end_element name
      puts "ending: #{name}"
    end
  end

这似乎是最好的选择,因为我可以简单地让它忽略其他 xml 或 html 文档。此外,这也是最有意义的,因为其中一些文档可能会变得非常大,因此将整个 dom 存储在内存中可能不起作用。

以下是一些示例文件:1 http://pastie.org/2378220 2 http://pastie.org/2378228 3 http://pastie.org/2378237

我开始认为我只需要编写自己的自定义解析器


Nokogiri 的正常 DOM 模式能够自动修复 XML,使其在语法上正确,或者合理地模仿它。有时它会变得混乱并且会移动结束标签,但您可以预处理文件以在需要时将其推向正确的方向。

我将 XML #1 保存到文档中并加载它:

require 'nokogiri'

doc = ''
File.open('./test.xml') do |fi|
  doc = Nokogiri::XML(fi)
end

puts doc.to_xml

解析后,您可以检查Nokogiri::XML::Document实例的errors方法来查看生成了哪些错误,以获取反常的乐趣。

doc.errors

如果使用 Nokogiri 的 DOM 模型还不够好,您是否考虑过使用XMLLint http://xmlsoft.org/xmllint.html预处理和清理数据,发出干净的 XML,以便 SAX 能够工作?它是--recover选项可能有用。

xmllint --recover test.xml

它将在 stderr 上输出错误,并在 stdout 上输出代码,因此您可以轻松地将其通过管道传输到另一个文件。

至于编写自己的解析器......为什么?您还有其他选择,重新发明一个实施良好的轮子并不是浪费时间的好方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ruby​​ 中清理格式错误的 xml 的相关文章

  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Rails 控制台无法运行

    rbenv 红宝石版本 2 6 6 导轨版本 5 1 4 我正在较旧的代码库中工作 ruby 2 6 6 rails 5 4 1 这是我每天使用的代码库 我必须通过 rbenv 下载一个新的 ruby 版本作为单独的存储库 这样做在我的旧代
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • XPath 中的 ., 有什么用?

    为什么在某些 XPath 表达式中句号后面使用逗号 这是一个例子 Set nlist doc selectNodes book author first name starts with M 我试图用谷歌搜索这个 但字面意思 运算符似乎不喜
  • 检查 XML 元素是否存在

    如何验证 XML 文件中是否存在特定元素 假设我有一个不断变化的 XML 文件 我需要在读取 解析它之前验证每个元素是否存在 if doc SelectSingleNode mynode null 应该这样做 显然 其中 doc 是您的 X
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 已定义方法的 Ruby 钩子?

    我一直在谷歌上搜索这个问题 但找不到答案 这让我认为答案是否定的 但我想我会在这里问 以防有人确切知道 Ruby 是否有一个钩子来定义方法 即在模块或类上 如果没有 是否有人足够熟悉该实施的情况main对象以了解它到底如何将方法复制到Obj
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • CakePHP Xml 实用程序库触发 DOMDocument 警告

    我正在使用 CakePHP 在视图中生成 XMLXML核心库 http book cakephp org 2 0 en core utility libraries xml html xml Xml build data array ret
  • XML-RPC 和 SOAP 有什么区别?

    我从来没有真正理解为什么 Web 服务实施者会选择其中之一 XML RPC 通常出现在较旧的系统中吗 任何有助于理解这一点的帮助将不胜感激 差异 SOAP 更强大 并且更受软件工具供应商 MSFT NET Java 企业版等 的青睐 SOA
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • Ruby 中的 DateTime.parse() 是否依赖于语言环境?

    我想知道以下示例的输出 解析时01 03 它会被解决为Mar 1st or Jan 3rd Ruby 不依赖于语言环境 因为红宝石是一个服务器端语言而不是客户端像 JavaScript 一样的语言 Ruby 使用系统时钟yourWeb 应用
  • 使用 XML 和 C# 创建 Word 文档

    我已经为报告创建了一个 xml 模板 用户应该能够通过我用 C 创建的程序添加信息以根据自己的需要个性化此报告 如何根据用户输入文本框的内容编辑实体的内容 然后将其显示在 Word 上 网上有大量有关使用 XML 和 C 创建 Word 文
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • 带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误

    我在尝试着update and delete视频使用YouTube API v3 https developers google com youtube v3 docs videos with OAuth2 用于身份验证 https dev
  • xsd 类型的 JAXB(取消)编组:xsd:base64Binary 和 xsd:hexBinary

    JAXB 映射两者xsd base64Binary and xsd hexBinary类型为byte 鉴于我有一个模式 一个 DOM 元素来表示这些类型 例如
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • Watir Webdriver 加载 Chrome 扩展

    我正在尝试使用 Watir 加载 chrome 扩展 但遇到了问题 我发现这个相关问题 能够启动带有 watir webdriver 加载扩展的 chrome https stackoverflow com questions 125867

随机推荐

  • HTML5 Canvas 中的取消绑定功能

    我想在 HTML5 Canvas 中取消绑定功能 示例 当我在选择选项矩形后选择画笔时 当我使用画笔时 它也会创建矩形 请帮助我解决同样的问题 Thanks Devesh 选择矩形然后选择橡皮擦后看到另一个矩形的原因如下 function
  • 将Android aar发布到artificialory

    我一直坚持将artifactory 3 0 1 插件与Gradle 集成 我使用的是 Android Studio 1 0 所以我猜我使用的是 Gradle 2 0 任何有关使用 3 0 1 插件发布到神器的示例都会非常有帮助 提前致谢 发
  • 仅评估宏参数一次

    在下面的代码中 无论传递什么retval对该令牌的每次使用都按照给定的方式进行评估 define CPFS RETURN commit retval do util cpfs exit commit return retval while
  • 通过 NFS 共享文件夹对 VirtualBox 上的 Hack 代码进行类型检查

    首先提到的似乎是谨慎的这个问题 https github com facebook hhvm issues 2311进而这个恰如其名的编辑 https github com facebook hhvm commit 3f8842fab404
  • 用正则表达式删除中文单词之间的所有空格

    我想删除其中的所有空格仅中文文本 My text 請 把 這 裡 的 10 多 個 字 合 併 Can you help me 理想输出 請把這裡的 10 多個字合併 Can you help me var str 請 把 這 裡 的 10
  • Altair 交互式线图,单击右侧图标时使线弹出并突出显示

    我一直在尝试在 jupyter 实验室上使用 Altair 制作一些交互式绘图 I had reached this stage where the results is below 正如您所看到的 当该行突出显示时 它不会弹出到前面 如何
  • 在提示符或 Android gradle 中检索 git 分支名称:在 Jenkins 上它返回 HEAD

    在 gradle 中 我想将当前分支名称和提交编号添加为我的 versionName 的后缀 为什么 因为当我在 Jenkins 中构建应用程序并在 HockeyApp 中发布它时 显示该应用程序是从哪个分支和提交构建的非常有用 因此 当我
  • 使用 cgroup 限制 CPU 总使用量

    我有一个使用的脚本ulimit t 5将程序的 CPU 时间限制为 5 秒 该程序现在会生成子进程 因此我想改用 cgroup 这样我就可以限制该进程及其子进程占用的 CPU 但是 我找不到对 cgroup 的 CPU 使用率设置硬性上限的
  • IE6&7“此页面包含安全和不安全项目”的原因

    我有一个 HTTPS 站点 在 IE6 和 7 中显示 错误地 一个对话框 内容如下 此页面包含安全和不安全的项目 您想显示不安全的项目吗 在任何合适的浏览器中都不会发生这种情况 但该站点是公司站点 并且许多客户仍在使用 Windows 2
  • 如何在 MATLAB 中使用计时器以固定时间间隔运行函数

    我想以 30 分钟的间隔运行一个函数 每次运行该函数时 都会采用不同的输入 假设我想运行 100 次 函数为lookupweather 输入为location1 location2 location3 location100 我试过了 fo
  • 是否可以为每个类创建一个空对象? (当然要借助工具)

    The 空对象模式 http en wikipedia org wiki Null Object pattern旨在成为 safe 中立 行为 这个想法是创建一个不执行任何操作的对象 但也不抛出 NullPointerException 例
  • 使用scrapy Spider捕获http状态码

    我是 scrapy 新手 我正在编写一个蜘蛛程序 旨在检查一长串服务器状态代码的 URL 并在适当的情况下检查它们被重定向到的 URL 重要的是 如果存在重定向链 我需要知道每次跳转的状态代码和 url 我正在使用 response met
  • 使用networkStream的Image.FromStream

    我正在尝试使用该方法FromStream班级的Image设置使用网络流通过 tcp 连接接收的图像 这是两侧代码 Server TcpListener server new TcpListener IPAddress Any 34567 s
  • 如何使用 javascript、jquery 等创建打印模式

    假设我在几页上有一个打印按钮 每当用户单击时 它将在模式中弹出内容并可以从那里打印 任何想法将不胜感激 我有几页带有打印按钮 当用户单击它时 需要将该内容拉入模式中 然后从该模式中打印 我现在无法为您编写代码 但我可以让您走上正轨 你需要使
  • 为什么我的实体不能与 SpringBoot 一起工作,尽管它可以在没有 SpringBoot 的情况下工作

    请注意 在调查时这个问题 https stackoverflow com questions 52799706 springboot not an entity noredirect 1 comment92527948 52799706我更
  • JavaFX 在多个页面上打印表格视图

    所以 我的问题是我需要打印 tableview 的内容 但其中有太多项目 它只打印其中的前 23 个 我已经在这里找到了一些解决方案 不幸的是它们没有多大帮助 这是我的打印方法 FXML private void printIt Print
  • 如何检测何时发生全屏事件(按 f11 键)[重复]

    这个问题在这里已经有答案了 如何在按下 f11 键时检测全屏事件何时发生 如果发生这种情况 则意味着屏幕处于全屏模式 然后显示警报 不使用键码比较 请给我一种不同的方法来执行此操作 mozilla proposal element requ
  • PyQt QtWebChannel:从 JavaScript 调用 Python 函数

    我正在尝试 使用 Qt 类QWebEngineView and QWebChannel在 HTML 页面和 Python 脚本之间建立简单的连接 目标只是执行foo 当标题 h2 被点击 import sys from PyQt5 QtCo
  • 项目中尚未使用旧版 People API

    我在调用 google 登录 API 时遇到错误 错误是 旧版 People API 之前未在项目 中使用过或已被禁用 但人员 API 已启用 如何解决这个错误 这是我的 google api url 这足以解决我的问题 if empty
  • 如何在 ruby​​ 中清理格式错误的 xml

    我在整理从以下网站返回的格式错误的 XML 代码时遇到问题SEC 的 edgar 数据库 http www sec gov edgar shtml 由于某种原因 他们形成了可怕的 xml 包含任何类型字符串的标签都不是封闭的 它实际上可以在