Ruby 获取child=x的父节点
当我找到匹配的子节点时,我想从XML源返回一个“父”节点 如果我搜索“ddd”:Ruby 获取child=x的父节点,ruby,arrays,nokogiri,Ruby,Arrays,Nokogiri,当我找到匹配的子节点时,我想从XML源返回一个“父”节点 如果我搜索“ddd”: @doc.xpath('//item[contains(., "ddd")]') 我想返回“Section 2” 我找不到关于Nokogiri的“where”类型代码的文档。 这可能吗 <entry> <match> <field>Section 1</field> <child> <item>aaa</
@doc.xpath('//item[contains(., "ddd")]')
我想返回“Section 2”
我找不到关于Nokogiri的“where”类型代码的文档。
这可能吗
<entry>
<match>
<field>Section 1</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>Section 2</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>Section 3</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
第一节
aaa
bbb
ccc
第二节
ddd
eee
fff
第三节
啊
三,
jjj
下面是一种更精确的XML格式。
我需要在节点树上下移动才能得到第2部分。
可能吗
<entry>
<match>
<field>
<foo>Section 1</foo>
</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>
<foo>Section 2</foo>
</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>
<foo>Section 3</foo>
</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
第一节
aaa
bbb
ccc
第二节
ddd
eee
fff
第三节
啊
三,
jjj
有一种方法名为:
根据您给出的XML,第2节不是父节点,它是
节点的同级节点
经过考验:
require 'nokogiri'
@doc = Nokogiri::XML.parse <<-XML
<entry>
<match>
<field>Section 1</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>Section 2</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>Section 3</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
XML
@doc.at_xpath('//child[./item[contains(., "ddd")]]').previous_element.text # => "Section 2"
需要“nokogiri”
@doc=Nokogiri::XML.parse有一个方法名为:
根据您给出的XML,第2节不是父节点,它是
节点的同级节点
经过考验:
require 'nokogiri'
@doc = Nokogiri::XML.parse <<-XML
<entry>
<match>
<field>Section 1</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>Section 2</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>Section 3</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
XML
@doc.at_xpath('//child[./item[contains(., "ddd")]]').previous_element.text # => "Section 2"
需要“nokogiri”
@doc=Nokogiri::XML.parse有一个方法名为:
根据您给出的XML,第2节不是父节点,它是
节点的同级节点
经过考验:
require 'nokogiri'
@doc = Nokogiri::XML.parse <<-XML
<entry>
<match>
<field>Section 1</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>Section 2</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>Section 3</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
XML
@doc.at_xpath('//child[./item[contains(., "ddd")]]').previous_element.text # => "Section 2"
需要“nokogiri”
@doc=Nokogiri::XML.parse有一个方法名为:
根据您给出的XML,第2节不是父节点,它是
节点的同级节点
经过考验:
require 'nokogiri'
@doc = Nokogiri::XML.parse <<-XML
<entry>
<match>
<field>Section 1</field>
<child>
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</child>
</match>
<match>
<field>Section 2</field>
<child>
<item>ddd</item>
<item>eee</item>
<item>fff</item>
</child>
</match>
<match>
<field>Section 3</field>
<child>
<item>hhh</item>
<item>iii</item>
<item>jjj</item>
</child>
</match>
</entry>
XML
@doc.at_xpath('//child[./item[contains(., "ddd")]]').previous_element.text # => "Section 2"
需要“nokogiri”
@doc=Nokogiri::XML.parse您可以在XPath中执行此操作:
@doc.xpath("/entry/match[child/item[contains(., 'ddd')]]/field/foo")
这是使用你的第二个样本。它首先查找match
元素,这些元素具有item
子元素,其中item
包含ddd
,然后查找该match
元素的foo
子元素 您可以在XPath中执行此操作:
@doc.xpath("/entry/match[child/item[contains(., 'ddd')]]/field/foo")
这是使用你的第二个样本。它首先查找match
元素,这些元素具有item
子元素,其中item
包含ddd
,然后查找该match
元素的foo
子元素 您可以在XPath中执行此操作:
@doc.xpath("/entry/match[child/item[contains(., 'ddd')]]/field/foo")
这是使用你的第二个样本。它首先查找match
元素,这些元素具有item
子元素,其中item
包含ddd
,然后查找该match
元素的foo
子元素 您可以在XPath中执行此操作:
@doc.xpath("/entry/match[child/item[contains(., 'ddd')]]/field/foo")
这是使用你的第二个样本。它首先查找match
元素,这些元素具有item
子元素,其中item
包含ddd
,然后查找该match
元素的foo
子元素 您可以使用“.”语法(类似于目录文件夹)轻松遍历树
因此,这应该是可行的:
@doc.xpath('//item[contains(., "ddd")]/..')
or
@doc.xpath('//item[contains(., "ddd")]/../field')
您可以使用“.”语法(类似于目录文件夹)轻松遍历树
因此,这应该是可行的:
@doc.xpath('//item[contains(., "ddd")]/..')
or
@doc.xpath('//item[contains(., "ddd")]/../field')
您可以使用“.”语法(类似于目录文件夹)轻松遍历树
因此,这应该是可行的:
@doc.xpath('//item[contains(., "ddd")]/..')
or
@doc.xpath('//item[contains(., "ddd")]/../field')
您可以使用“.”语法(类似于目录文件夹)轻松遍历树
因此,这应该是可行的:
@doc.xpath('//item[contains(., "ddd")]/..')
or
@doc.xpath('//item[contains(., "ddd")]/../field')
太棒了。。!我的问题是我所需要的一个简单的版本,但这让我走上了正确的道路。。这在哪里有记录?也。。。有没有一种方法可以按名称调用父节点,因为在现实世界中,我想要的是从我的子节点中增加一个新节点。@Beertastic我给出了链接。Sweet。。。现在读起来。。。出于某种原因,我认为这都是Nokogiri文档,而不是纯Ruby。。谢谢…我已经更新了我的问题。。。然而,在当地I@m获取此错误:未定义的方法“上一个元素”。。所有这些都只是使用标准的nokogiri,对吗?@Beertasic好吧,我不知道你的XML结构。。在本例中,在搜索节点之前,没有兄弟元素。。这就是为什么您会得到nil
。。并且在其上调用该方法。。这就是错误的原因。您需要很好地阅读XML,XPATH也需要适当。nokogiri没有问题……)太棒了。。!我的问题是我所需要的一个简单的版本,但这让我走上了正确的道路。。这在哪里有记录?也。。。有没有一种方法可以按名称调用父节点,因为在现实世界中,我想要的是从我的子节点中增加一个新节点。@Beertastic我给出了链接。Sweet。。。现在读起来。。。出于某种原因,我认为这都是Nokogiri文档,而不是纯Ruby。。谢谢…我已经更新了我的问题。。。然而,在当地I@m获取此错误:未定义的方法“上一个元素”。。所有这些都只是使用标准的nokogiri,对吗?@Beertasic好吧,我不知道你的XML结构。。在本例中,在搜索节点之前,没有兄弟元素。。这就是为什么您会得到nil
。。并且在其上调用该方法。。这就是错误的原因。您需要很好地阅读XML,XPATH也需要适当。nokogiri没有问题……)太棒了。。!我的问题是我所需要的一个简单的版本,但这让我走上了正确的道路。。这在哪里有记录?也。。。有没有一种方法可以按名称调用父节点,因为在现实世界中,我想要的是从我的子节点中增加一个新节点。@Beertastic我给出了链接。Sweet。。。现在读起来。。。出于某种原因,我认为这都是Nokogiri文档,而不是纯Ruby。。谢谢…我已经更新了我的问题。。。然而,在当地I@m获取此错误:未定义的方法“上一个元素”。。所有这些都只是使用标准的nokogiri,对吗?@Beertasic好吧,我不知道你的XML结构。。在本例中,在搜索节点之前,没有兄弟元素。。th