- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 Ruby(在我的机器上为 ruby 2.1.2p95 (2014-05-08) [x86_64-linux-gnu]
,在生产环境中为 ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
)和 Nori 将 XML 文档(最初使用 Nokogiri 处理以进行一些验证)转换为 Ruby 哈希,但后来我发现 Nori正在删除最深的 XML 元素的属性。
为此,我使用了类似于以下的代码:
xml = Nokogiri::XML(File.open('file.xml')) { |config| config.strict.noblanks }
hash = Nori.new.parse xml.to_s
除一种情况外,代码通常按预期工作。每当 Nori 解析 XML 文本时,它都会从叶元素(即没有子元素的元素)中删除元素属性。
例如下面的文件:
<?xml version="1.0"?>
<root>
<objects>
<object>
<fields>
<id>1</id>
<name>The name</name>
<description>A description</description>
</fields>
</object>
</objects>
</root>
...转换为预期的哈希(为简洁起见省略了一些输出):
irb(main):066:0> xml = Nokogiri::XML(txt) { |config| config.strict.noblanks }
irb(main):071:0> ap Nori.new.parse(xml.to_s), :indent => -2
{
"root" => {
"objects" => {
"object" => {
"fields" => {
"id" => "1",
"name" => "The name"
"description" => "A description"
}
}
}
}
}
当元素属性用于没有子元素的元素时,问题就会出现。例如,以下文档未按预期转换:
<?xml version="1.0"?>
<root>
<objects>
<object id="1">
<fields>
<field name="Name">The name</field>
<field name="Description">A description</field>
</fields>
</object>
</objects>
</root>
同Nori.new.parse(xml.to_s)
, 如 awesome_print
所示, 显示最深的属性 <field>
元素不存在:
irb(main):131:0> ap Nori.new.parse(xml.to_s), :indent => -2
{
"root" => {
"objects" => {
"object" => {
"fields" => {
"field" => [
[0] "The name",
[1] "A description"
]
},
"@id" => "1"
}
}
}
}
哈希仅将它们的值作为列表,这不是我想要的。我期待 <field>
元素保留它们的属性,就像它们的父元素一样(例如,参见 @id="1"
的 <object>
),而不是为了它们的属性被切断。
即使将文档修改成如下所示,它仍然无法按预期工作:
<?xml version="1.0"?>
<root>
<objects>
<object id="1">
<fields>
<Name type="string">The name</Name>
<Description type="string">A description</Description>
</fields>
</object>
</objects>
</root>
它产生以下哈希:
{
"root" => {
"objects" => {
"object" => {
"fields" => {
"Name" => "The name",
"Description" => "A description"
},
"@id" => "1"
}
}
}
}
缺少 type="whatever"
每个字段条目的属性。
搜索最终将我引向 Issue #59最后一篇文章(2015 年 8 月)说他无法“找到 Nori 代码中的错误。”
所以,我的问题是:你们中有人知道解决 Nori 问题的方法(例如,可能是一种设置),可以让我使用我的原始模式(即带有没有 child 的元素中的属性)?如果是这样,您能否分享一个能够正确处理此问题的代码片段?
我不得不重新设计我的 XML 架构并更改代码大约 3 次才能使其正常工作,所以如果有一种方法可以让 Nori 正常工作,而我根本不知道它,我想知道它是什么。
我想避免尽可能多地安装更多的库,只是为了让它与我最初想使用的模式结构一起正常工作,但如果它被证明,我愿意接受这种可能性上类。 (我不得不再次重构代码...)框架对此肯定是矫枉过正,所以请:不要建议 Ruby on Rails或类似的全栈解决方案。
请注意,我当前的解决方案基于(不情愿地)重新设计的模式,它正在运行,但生成和处理比原始模式更复杂,我想回到更简单/更浅的模式。
最佳答案
Nori 实际上并没有删除属性,它们只是没有被打印出来。
如果您运行 ruby 脚本:
require 'nori'
data = Nori.new(empty_tag_value: true).parse(<<XML)
<?xml version="1.0"?>
<root>
<objects>
<object>
<fields>
<field name="Name">The name</field>
<field name="Description">A description</field>
</fields>
</object>
</objects>
</root>
XML
field_list = data['root']['objects']['object']['fields']['field']
puts "text: '#{field_list[0]}' data: #{field_list[0].attributes}"
puts "text: '#{field_list[1]}' data: #{field_list[1].attributes}"
你应该得到输出
["The name", "A description"]
text: 'The name' data: {"name"=>"Name"}
text: 'A description' data: {"name"=>"Description"}
这清楚地表明该属性在那里,但是 inspect
方法没有显示(p(x)
函数与 puts x 相同.检查
)。
您会注意到 puts field_list.inspect
输出 ["The name", "A description"]
。但是 field_list[0].attributes
打印属性键和数据。
如果你想让 pp
显示它,你可以重载 Nori::StringWithAttributes
中的 inspect
方法。
class Nori
class StringWithAttributes < String
def inspect
[attributes, String.new(self)].inspect
end
end
end
或者,如果您想更改输出,您可以重载 self.new
方法,让它返回不同的数据结构。
class Nori
class MyText < Array
def attributes=(data)
self[1] = data
end
attr_accessor :text
def initialize(text)
self[0] = text
self[1] = {}
end
end
class StringWithAttributes < String
def self.new(x)
MyText.new(x)
end
end
end
并以元组的形式访问数据
puts "text: '#{data['root']['objects']['object']['fields']['field'][0].first}' data: #{ data['root']['objects']['object']['fields']['field'][0].last}"
这样您就可以将数据作为 JSON 或 YAML,因为文本项看起来像具有 2 个元素的数组。pp
也可以。
{"root"=>
{"objects"=>
{"object"=>
{"fields"=>
{"field"=>
[["The name", {"name"=>"Name"}],
["A description", {"name"=>"Description"}]]},
"bob"=>[{"@id"=>"id1"}, {"@id"=>"id2"}],
"bill"=>
[{"p"=>["one", {}], "@id"=>"bid1"}, {"p"=>["two", {}], "@id"=>"bid2"}],
"@id"=>"1"}}}}
这应该做你想做的。
require 'awesome_print'
require 'nori'
# Copyright (c) 2016 G. Allen Morris III
#
# Awesome Print is freely distributable under the terms of MIT license.
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
#------------------------------------------------------------------------------
module AwesomePrint
module Nori
def self.included(base)
base.send :alias_method, :cast_without_nori, :cast
base.send :alias_method, :cast, :cast_with_nori
end
# Add Nori XML Node and NodeSet names to the dispatcher pipeline.
#-------------------------------------------------------------------
def cast_with_nori(object, type)
cast = cast_without_nori(object, type)
if defined?(::Nori::StringWithAttributes) && object.is_a?(::Nori::StringWithAttributes)
cast = :nori_xml_node
end
cast
end
#-------------------------------------------------------------------
def awesome_nori_xml_node(object)
return %Q|["#{object}", #{object.attributes}]|
end
end
end
AwesomePrint::Formatter.send(:include, AwesomePrint::Nori)
data = Nori.new(empty_tag_value: true).parse(<<XML)
<?xml version="1.0"?>
<root>
<objects>
<object>
<fields>
<field name="Name">The name</field>
<field name="Description">A description</field>
</fields>
</object>
</objects>
</root>
XML
ap data
因为输出是:
{
"root" => {
"objects" => {
"object" => {
"fields" => {
"field" => [
[0] ["The name", {"name"=>"Name"}],
[1] ["A description", {"name"=>"Description"}]
]
}
}
}
}
}
关于ruby - XML 到哈希转换 : Nori drops the attributes of the deepest XML elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735053/
我正在使用 gfx-hal,这需要我创建需要使用特定于其类型的函数显式销毁的资源。我想将这些类型的实例存储在结构中,并且我还想将清理它们与拥有结构的生命周期相关联,而不是手动管理它们的生命周期并可能在
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve
我知道这一定是非常明显的事情,但我不明白。我有两个 div,一个可拖动,另一个带有 on:drop,当我将可拖动的 div 放到它上面时,它似乎没有被调用。我错过了什么? 回复:https://sve
在下面的应用程序中,从未调用 drop 方法。放置目标 ( div2 ) 由 dragEnter 和 dragOver 事件中的取消事件指示,但不触发放置。 HTML 和 .dart 如下:
我已经使用 ng2 文件上传实现了文件删除。我面临的问题是,当文件被拖放到拖放区域之外时,浏览器会打开它。有什么办法可以防止这种事件发生吗? Angular 2/4 最佳答案 是的,终于成功了。我希望
我是使用rust 的新手。我的简单代码 struct Foo{ data : & 'a String, } fn test_foo(){ let s1:String = String::
我希望 image.src 显示 id,而不是每个 的值。 drop.id 存在吗?这可以做到吗?或者id被锁定在中?当用户点击提交时,我需要传递表单中的值。 function swapImage
我正在使用一个数据框,我必须将两列(定量和销售)添加然后删除它们,然后将列名称的第一个字母大写。问题是当我使用 drop 时,它会将其保存到另一个数据帧。从文档来看,问题来自 inplace=fals
我想让 Drop left 而不是在 bootstrap 下拉按钮中下拉。我正在努力实现这一点,但我无法做到这一点,有人可以指导我这样做吗? 这是我的代码 Small button
我在使用 Blazor 时遇到了一个奇怪的问题... 我有一个使用拖放功能的应用程序,它使用 .Net Core 3.1 运行良好。然而,无论我做什么,drop 事件现在都不会被解雇,我不知道为什么。
我希望能够移动(在灰色背景上,通过拖放)Bootstrap 2 提供的模态表单。谁能告诉我实现此目的的最佳实践是什么? 最佳答案 默认情况下, Bootstrap 不附带任何拖放功能,但您可以添加一些
我试图在拖放过程中更改节点上的光标,但图像没有改变。我打电话 setCursor()在 DragDetectedEventHandler我的节点。我也试过调用 getParent().setCurso
我刚刚注意到您可以在 PostgreSQL 中编写两者。有什么区别还是只是“简化”的语法。据我所知,这两者的作用完全相同。 ALTER TABLE table DROP my_column; 对比 A
我将屏幕分为两个 DIV。在左侧的 DIV 中,我有一些 50x50 像素的 DIV,在右侧的 DIV 中,我有一个由 80x80 LI 组成的空网格 。左侧的 DIV 是可拖动的,一旦放到 LI 上
我正在使用这个库 Drop ,但是记录很差,我不明白如何使用它。首先我安装了: npm install tether-drop 我已经下载了 Drop.js,然后用 Tether 导入它(导入所有内容
我想使用 jQuery 处理拖放 HTML 5 功能。直到没有触发 drop 事件为止都可以。看看我的代码: A B C $('#columns .column').on({
我需要使用 mysqldump 和 replace 而不是 insert 并且在恢复时不删除数据库和表。但我需要删除并重新创建触发器和存储过程 为此,我将 mysqldump 与 --replace
在 CD 管道中,我使用下载构建工件任务将工件下载到目标目录。我的发布工件目录结构如下 drop --> 来源 --> abc.zip 现在的问题是,每当我下载工件时,它都会下载整个放置文件夹并将相同
您好,我正在开发拖放应用程序。我有一个可以沿着文档拖动的 DIV,并且文档中还有其他一些 div,我可以将一个 div 拖到其他 div,这会使页面变得困惑它在空的地方并禁用另一个 div 中的放置,
我有以下代码: $(".dropzone").on("dragover", function(ev) { ev.preventDefault();
我是一名优秀的程序员,十分优秀!