2017-02-13 116 views
0

我试图访问XML文档中的元素内的元素。我认为我刚刚开始了解命名空间的事实让我感到沮丧。使用Nokogiri访问嵌套元素

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文档

<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> 
+0

请阅读“[mcve]”。您的XML无效:'doc.errors#=> [#,#,#,#]'如果已经存在,您将需要修复它错误输入,以准确地反映它应该是什么,或者,如果源代码中出现错误,则需要在尝试解析之前进行修复。 –

+0

谢谢,我相信现在已经修好了。 – Mike

回答

0

所以,我想通了,我的部分问题,这是我需要把每个动物作为XML片段。所以,我必须这样做:

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

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

希望能帮助别人。

+0

您很少需要将DocumentFragment用于XML文档。在使用'Nokogiri :: HTML(...)'或'Nokogiri :: XML(...)'解析完整个文档后,我们使用'search'或其CSS或XPath版本遍历节。这听起来像你走错了路,但你的示例数据不足以帮助你。这里有很多例子来说明这个过程。 –

+0

谢谢锡文。当我回到这个任务时,我会回去重新开始,没有DocumentFragment。 – Mike