我正在使用 java 的 sax 类来解析 xml 文件。如果 xml 文件是 1.0 版,一切正常,但如果是 1.1 版,一些属性会被破坏,给我错误的结果,但不会抛出任何异常。
我的 xml 文件基本上是这样的:
<?xml version="1.1" encoding="UTF-8" ?>
<gpx>
<trk>
<name>Name of the track</name>
<trkseg>
<trkpt lat="12.3456789" lon="1.2345678">
<ele>1234</ele>
<time>2013-03-26T12:34:56Z</time>
<speed>0</speed>
</trkpt>
... and then 419 further identical copies of this trkpt
</trkseg>
</trk>
</gpx>
因此,当我使用 sax 解析此文件时,我希望找到 420 个 trkpt 标签,并且每个标签都具有 lat 和 lon 属性。特别是,我希望找到 420 个“lat”属性,它们都是“12.3456789”。
为了解析,我构造了一个处理程序对象并将其提供给此本地文件的流:
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
inStream = new FileInputStream(file);
saxParser.parse(inStream, handler);
System.out.println("done");
处理程序类扩展 org.xml.sax.helpers.DefaultHandler 并且只有一个方法 startElement 来响应 trkpt 标签的打开:
public void startElement(String uri, String localName, String qName, Attributes attributes)
{
if (qName.equals("trkpt") && attributes != null
&& attributes.getLength() == 2
&& attributes.getValue(0).charAt(0) != '1')
{
// The trkpt tag has two attributes
// but the value of the first one doesn't begin with '1'
System.out.println(attributes.getQName(0) + " = " + attributes.getValue(0));
}
super.startElement(uri, localName, qName, attributes);
}
那么结果呢? 如果 xml 文件的版本是 1.0,那么我所看到的就是“完成”。找到了 420 个 trkpt 标签,它们都有两个属性,第一个总是称为“lat”,这个属性的值总是以“1”开头,正如我所料。太棒了!
如果将 xml 文件更改为在第一行指定 version="1.1",那么我会得到以下输出:
lat = :34.56Z</t
lat = :56Z</time
done
所以即使我所有的 420 点应该是相同的,但其中有两个给了我一个完全错误的属性值。没有异常被抛出。仍然找到了 420 个 trkpt,并且都有两个属性,称为“lat”和“lon”。奇怪的是,lon 值总是正常的。
我通过直接复制/粘贴第一个 trkpt 在文本编辑器中创建了这个 xml 文件,所以我确定所有值都是相同的,我确定 xml 文件中没有具有有趣属性值的点,并且我确定文件中没有非 ascii 字符值或实体代码或任何其他奇怪的内容。
我已经在具有两个不同操作系统的三台不同机器上使用 Sun 的 JRE6、OpenJDK6 和 OpenJDK7 进行了尝试。所以要么我做错了什么,要么这个特定的 xml 文件以某种方式与 xml1.1 不兼容,要么存在一个普遍存在的 sax 错误(这似乎不太可能,因为我预计它会影响很多人)。再次请注意,使用 xml1.0 一切正常。还要注意,数字 420 没有什么特别之处,只是如果文件只有 100 个条目,那么它们都会被正确解析。如果您有几千个条目,那么其中一定数量的第一个属性值会以这种方式被破坏。属性值的长度似乎总是正确的,但它从文件中的错误位置拉出字符。索引溢出?
我尝试删除所有速度标签,但如果您有足够的 trkpts,问题仍然存在。它对额外的空格也很敏感,所以如果我在 trkpts 之间添加换行符,问题会出现在不同的点或返回不同的属性值。
最佳答案
此错误已在 JDK XML 解析器中存在多年,Sun 和 Oracle 都没有表现出任何修复它的兴趣。我强烈建议优先使用 Apache Xerces XML 解析器。
关于java sax 解析器破坏 xml 1.1 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15634536/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我主要使用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
我正在使用ruby1.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.\"\
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und