2017-02-13 10 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

XML文書でDocumentFragmentを使用することはめったにありません。 'Nokogiri :: HTML(...)'や 'Nokogiri :: XML(...) 'を使って文書全体を解析した後、' search'やそのCSSやXPath版を使ってセクションを繰り返し処理します。あなたが間違った経路をたどっているように聞こえますが、あなたのサンプルデータはあなたを助けるには十分ではありません。 SOには、そのプロセスを示す多くの例があります。 –

+0

ありがとうTin Man。私がその作業に戻ると、私は戻ってDocumentFragmentを使わずにその部分を始めます。 – Mike

関連する問題