2017-02-13 1 views
0

XML 문서에서 요소 내의 요소에 액세스하려고합니다. 나는 네임 스페이스에 대해 배우기 시작했다는 사실이 나를 트립시키고 있다고 생각한다. XSD 헤더Nokogiri로 중첩 된 요소에 액세스

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 # => [# Nokogiri :: XML :: SyntaxError : 속성 이름을 분석하는 중 오류 발생>, # Nokogiri :: XML :: SyntaxError : 속성 생성 오류>, # , # ]'끝났다면 수정해야합니다. 오타가 잘못되었거나 구문 분석을 시도하기 전에 픽스 업을 수행해야합니다. –

+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 버전을 사용하여 섹션을 반복합니다. 잘못된 경로로 내려가는 것처럼 들리지만 예제 데이터만으로는 도움이되지 않습니다. 여기에 그 과정을 보여주는 수많은 예제가 있습니다. –

+0

감사합니다. Tin Man. 이 작업으로 돌아 가면 DocumentFragment없이 다시 시작합니다. – Mike

관련 문제