使用Nokogiri访问嵌套元素

时间:2017-02-13 21:46:37

标签: ruby xml xsd nokogiri

我试图访问XML文档中元素中的元素。我认为我刚开始学习命名空间这一事实让我感到沮丧。

XSD标题

xsd:schema targetNamespace="urn:gtig:/my/namespace" xmlns:XX="urn:gtig:/my/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

因为原始文档不符合架构,所以我需要遍历元素并更新它们。但我似乎无法访问xml结构中的所有元素。这是一个像我一样的循环:

这很好用:

animals = @builder.doc.xpath("//myns:animal", 'myns' = 'urn:gtig:/my/namespace')
animals.each { |a|
  a.attributes['type'].remove
  a['newtype'] = "mammal"

但不是循环的下一部分:

 c = a.xpath('cat/siamese')

也不是这样:

c = a.xpath("//myns:cat/siamese", 'myns' = 'urn:gtig:/my/namespace')

" C"是空的。所以,我能够访问动物,但不能访问其中的元素。

XML Doc

<message xmlns="urn:gtig:/my/namespace" xmlns:XX="urn:gtig:/my/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <animal type="mammal">
    <cat>
      <siamese>value</siamese>
    </cat>
  </animal>
</message>

1 个答案:

答案 0 :(得分:0)

所以,我想出了我的问题部分,我需要将每个动物视为XML片段。所以,我需要这样做:

c = Nokogiri::XML::DocumentFragment.parse(a)
siamese_cat = c.xpath(.//cat/siamese)

现在的问题是我需要删除一个属性,并在siamese_cat上添加一个新属性,这是我现实生活中的一个节点集。还没有想出那个语法。

希望这会有助于其他人。