Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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/3/arrays/14.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 获取child=x的父节点_Ruby_Arrays_Nokogiri - Fatal编程技术网

Ruby 获取child=x的父节点

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</

当我找到匹配的子节点时,我想从XML源返回一个“父”节点

如果我搜索“ddd”:

@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