Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Ruby解析XML_Ruby_Xml Parsing - Fatal编程技术网

用Ruby解析XML

用Ruby解析XML,ruby,xml-parsing,Ruby,Xml Parsing,我对使用XML是一个新手,但我只是有一个需要。我得到了一种常用的XML格式。标签中有冒号 <THING1:things type="Container"> <PART1:Id type="Property">1234</PART1:Id> <PART1:Name type="Property">The Name</PART1:Name> </THING1:things> …这是刚刚从: 我想我可以从这里找到一些东西

我对使用XML是一个新手,但我只是有一个需要。我得到了一种常用的XML格式。标签中有冒号

<THING1:things type="Container">
  <PART1:Id type="Property">1234</PART1:Id>
  <PART1:Name type="Property">The Name</PART1:Name>
</THING1:things>
…这是刚刚从:


我想我可以从这里找到一些东西,但这段代码什么也不返回。这不是错误。它只是返回。

正如@pguardiario提到的,是事实上的XML和HTML解析库。如果您想打印出示例中的
Id
Name
值,下面是您的方法:

require 'nokogiri'

xml_str = <<EOF
<THING1:things type="Container">
  <PART1:Id type="Property">1234</PART1:Id>
  <PART1:Name type="Property">The Name</PART1:Name>
</THING1:things>
EOF

doc = Nokogiri::XML(xml_str)

thing = doc.at_xpath('//things')
puts "ID   = " + thing.at_xpath('//Id').content
puts "Name = " + thing.at_xpath('//Name').content
这将为您提供:

Id   = 1234
Name = The Name1

ID   = 2234
Name = The Name2
如果您更熟悉CSS选择器,可以使用几乎相同的代码位:

doc.css('things').each do |thing|
  puts "ID   = " + thing.at_css('Id').content
  puts "Name = " + thing.at_css('Name').content
end

若在Rails环境中,
散列
对象被扩展,可以利用来自xml的方法

xml = File.open("myfile.xml")
data = Hash.from_xml(xml)

我认为第1行应该是,而不是type=“Container”>?您能告诉我们您的Hpricot尝试吗?它可以处理名称空间,我们可以帮助您找出尝试中的错误,而不是尝试重新开始。在这一点上,我真的没有太多尝试。只是想模仿一个教程。我将编辑此帖子以包括在内。作为记录,hpricot不再被维护。我们现在都在使用nokogiri。
THING1
PART1
是XML名称空间,应该声明。这太棒了。我有一个项目的工作。就像你说的那样,它似乎会拉动第一个项目,但不会拉动其他项目。你能举例说明如何输出所有的“东西”吗?我已经用一个例子更新了我的答案。这有用吗?您需要添加某种根元素,您的XML文件可能具有这种根元素。然后需要从xpath查询中删除//(或者使用CSS接口,我更喜欢)。Nokogiri的文档中有关于搜索的内容,所以我希望这也有用。更新。。。链接移动到:
remove_名称空间救了我!为什么有时有必要这样做?@jayqui这完全取决于您的文档,以及您如何编写选择器。提供了关于行为的更多信息。
from_xml
不是本机哈希方法,它是Rails/ActiveSupport的一部分。如果您在那个环境中,它可以正常工作。这只适用于rails环境,而不适用于平原环境ruby@YakobUbaidi注意post.YMMV的前五个单词。这并不总是将您期望/需要的子数据结构转换为哈希。它可能会将这些嵌套的子级转换为数组,在这种情况下,您将丢失键。
doc.css('things').each do |thing|
  puts "ID   = " + thing.at_css('Id').content
  puts "Name = " + thing.at_css('Name').content
end
xml = File.open("myfile.xml")
data = Hash.from_xml(xml)