gpt4 book ai didi

ruby - Nokogiri 的简单 XML 解析示例

转载 作者:行者123 更新时间:2023-12-01 11:35:40 28 4
gpt4 key购买 nike

我正在尝试获取 Response 对象的键和值列表,以便我可以将它们转换为哈希,但是我在理解 Nokogiri 时遇到了问题。 XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<Response>
<Name>Anonymous</Name>
<ExternalDataReference></ExternalDataReference>
<EmailAddress>hi guys</EmailAddress>
<IPAddress>blahblah</IPAddress>
<Status>0</Status>
..... (approximately 30 more elements within each response tag)
</Response>
(approximately 75 more response tags in the document)

我的目标是为每个 Response 得到这样的东西:
Name: Anonymous
ExternalDataReference:
EmailAddress: hi guys
IPAddress: blahblah

到目前为止我的代码:
f=File.open("./stufftoparse.xml")
doc = Nokogiri::XML(f)
puts "#{doc.xpath("//Response").keys} \n#{doc.xpath("//Response").values}"

我知道上面的代码不起作用,但我不太明白如何获取 Response 标签中的元素(我不认为它们是 Response 的属性,因为它们在它们自己的 XML 中)。有人可以解释如何做到这一点吗?请注意,我花了一些时间阅读 Nokogiri 文档,但找不到与 XPATH 示例相关的太多内容。

附加问题:
我怎样才能将响应分开,以便我有这样的东西?
Response1:
Name: Anonymous
ExternalDataReference:
EmailAddress: hi guys
IPAddress: blahblah

Response2:
Name: Anonymous
ExternalDataReference:
EmailAddress: hi guys
IPAddress: blahblah

最佳答案

如果您分步尝试,解决方案会更容易看到。

示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<foo>
<goo>a</goo>
<hoo>b</hoo>
</foo>
<foo>
<goo>c</goo>
<hoo>d</hoo>
</foo>
</xml>

语法 //foo选择所有 foo元素。
> puts doc.xpath("//foo")
<foo>
<goo>a</goo>
<hoo>b</hoo>
</foo>
<foo>
<goo>c</goo>
<hoo>d</hoo>
</foo>

Nokogiri 将节点返回为 NodeSet像这样:
> puts doc.xpath("//foo").class
Nokogiri::XML::NodeSet

一个 NodeSet是可枚举的;您可以使用 each 等方法, map , 等等。
> puts doc.xpath("//foo").kind_of?(Enumerable)
true

NodeSet包含两个 foo元素:
> doc.xpath("//foo").each{|e| puts e.class }
Nokogiri::XML::Element
Nokogiri::XML::Element

语法 //foo/*选择 foo元素的子元素:
> puts doc.xpath("//foo/*")
<goo>a</goo>
<hoo>b</hoo>
<goo>c</goo>
<hoo>d</hoo>

要打印元素的信息,请参阅 Nokogiri/XML/Node文件;您可能需要的两种方法是 nametext .

为您解决:
> doc.xpath("//foo/*").each{|e|
puts "#{e.name}:#{e.text}"
}
goo:a
hoo:b
goo:c
hoo:d

对于您的第二个问题,您基本上是在问:
  • 每个foo元素,获取其子元素
  • 对于每个子元素,打印名称和文本

  • 为您解决:
    > doc.xpath("//foo").each_with_index{|parent_elem, parent_count| 
    puts "Parent #{parent_count + 1}"
    parent_elem.elements.each{|child_elem|
    puts "#{child_elem.name}:#{child_elem.text}"
    }
    }

    关于ruby - Nokogiri 的简单 XML 解析示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27454302/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com