草庐IT

xml - 基本的 DOM XML 解析器需要什么?

coder 2023-06-28 原文

我已经开始使用 Google 的 Go 语言进行编程,我尝试编写的程序包是一个用于处理和创建 DOCX 文件的 API(我对这个主题很熟悉,认为这将是学习 Go 的好方法).由于 DOCX 文件主要是一个 ZIP 文件,其中包含各种 XML 文件,因此我更需要一个 DOM XML 解析器。但是,我无法找到任何原生的 Go DOM XML 解析器,因为我看到的唯一解析器似乎非常有限,可能还有 SAX 解析器(任何使用 Go 的人,如果我错了请纠正我)。

所以在过去的这个周末,我编写了一个非常基本的 DOM XML 解析器,它能够解析 DOCX 包中一个更简单的 XML 文件并将其原封不动地输出回来。目前我不会为命名空间、XSLT 或模式验证支持而烦恼,因为它们对操作 DOCX 文件没有用处。我的问题是,将哪些其他 XML 标准和功能合并到解析器中很重要?

目前,它实际上只是创建了一个元素和属性树,我可以对其进行修改和保存。我目前不处理 CDATA 元素或 XML 转义字符(尽管这些很容易做到,我将在本周末处理)。

最佳答案

首先:如果你专门要做DOM解析器,你需要实现DOM API。但我不确定你是否真的是那个意思;也许您只是指生成 XML 树模型(“dom”)的 XML 解析器;或者只是一个 XML 解析器? DOM 并不是唯一的方法。 另请注意,使用 SAX 解析器实现 DOM 树模型是最常见的方式;很少有 DOM 包具有嵌入式解析器,通常解析器是单独公开的。

关于 XML 解析器功能,在我看来,一些必须的东西是:

  • 处理字符实体(& 符号和数字)、预定义的通用实体(lt、gt、apos、quot)
  • xml声明的处理()
  • 处理各种输入编码;通过 xml 声明或外部声明 - 太多解析器忽略了这一点,但这非常重要,因为 xml 文档可以在内部可靠地检测编码。
  • 检查属性值的唯一性
  • 检查元素是否正确嵌套
  • 跳过评论
  • 跳过(如果不处理)处理指令
  • CDATA 处理——操作简单
  • 跟踪错误报告的行号

其他最终有用的东西是:

  • 命名空间处理
  • 检查字符有效性,包括内容和名称
  • 根据 xml 规范对 lineefed 进行规范化

关于xml - 基本的 DOM XML 解析器需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713811/

有关xml - 基本的 DOM XML 解析器需要什么?的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  3. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐