2017-03-22 5 views
2

노드 집합 업데이트하는 방법 :나는 다음과 같은 XML에 한 번 더 <code><EventRouter></code> 요소를 추가하려고

<EventRouters> 
     <EventRouter id="Important Events to Log File" class="com.cyclonecommerce.events2.router.LogFileRouter" active="true"> 
      <Parameters file="../logs/%nodeName%_events.log" 
         rollOnStart="false" autoFlush="true" 
         maxFileSize="2M" maxBackupFiles="5"/> 
      <MetadataProcessorListRef ref="Messaging"/> 
      <EventFilterRef ref="Important"/> 
     </EventRouter> 
     <EventRouter id="Message Detail to Log File" class="com.cyclonecommerce.events2.router.LogFileRouter" active="false"> 
      <Parameters file="../logs/%nodeName%_message_detail.log" 
         rollOnStart="true" autoFlush="true" 
         maxFileSize="2M" maxBackupFiles="5"/> 
      <MetadataProcessorListRef ref="Messaging"/> 
      <EventFilterRef ref="Message Detail"/> 
     </EventRouter> 

</EventRouters> 

나는 노드 세트에 노드를 추가 할 수 있어요하지만 XML을 저장 한 후 내가받지 오전 업데이트를 XML 내가 원하는 :

require 'nokogiri' 

if File.exist?('a.xml') 
    data = File.read("a.xml") 

end 
doc = Nokogiri::XML.parse data 
doc2=doc.xpath("//EventRouters/EventRouter") 

event_router = Nokogiri::XML::Node.new("EventRouter",doc) 
event_router['id'] = "some" 
param_node = Nokogiri::XML::Node.new("Parameters",doc) 
param_node.content = "some content" 
event_router << param_node 
doc2<< event_router 

File.open('test.xml', 'w') do |file| 
    file.print doc.to_xml 
end 
+0

은 무엇을'session_node '? "[mcve]"를 읽으십시오. 당신의 코드는 여러분이 묻고있는 문제를 보여줄 필요가 있습니다. –

+0

원하는 것을 보여주기 위해 XML 샘플을 _bare minimum_으로 줄이십시오. 그 이상으로 질문에주의를 산만하게합니다. 또한이를 기반으로 출력물의 예를 보여줍니다. Stack Overflow는 온라인 참고 자료이며 앞으로 다른 사람들이이 문제를 해결할 수 있도록 도와주는 것이므로 명확하고 완전한 질문이 중요합니다. –

+0

@ theTinMan : 코드를 수정했습니다. – muski

답변

0

새 노드를 추가하는 것은 간단합니다. 기본 아이디어는 XML 또는 HTML 구문 분석과 비슷합니다.

  1. 새 콘텐츠를 추가 할 노드를 찾습니다.
  2. 적절한 방법을 사용하여 노드의 자식 시작 부분이나 노드를 래트하는 형제 또는 부모로 내용을 추가하십시오. 그 방법은 the Node documentation에 있습니다.
  3. 끝났습니다.

    require 'nokogiri' 
    doc = Nokogiri::XML('<xml><node/></xml>') 
    
    node = doc.at('node') 
    node.add_child('<foo>bar</foo>') 
    doc.to_xml # => "<?xml version=\"1.0\"?>\n<xml>\n <node>\n <foo>bar</foo>\n </node>\n</xml>\n" 
    

    당신은 새로운 노드를 생성의 긴 길을 갈 수 있지만이 건물을 찾을 :

노코 기리 쉽게 그것을 구문 분석하고 노드로 변환하는 문자열을 사용하여 노드를 추가 할 수 있습니다 더 쉬운 문자열.

<?xml version="1.0"?> 
<EventRouters> 
    <EventRouter>original1</EventRouter><EventRouter id="some"><Parameters>some content</Parameters></EventRouter> 
    <EventRouter>original2</EventRouter><EventRouter id="some"><Parameters>some content</Parameters></EventRouter> 
</EventRouters> 

당신은에 추가 할 <<을 사용하려는 :

require 'nokogiri' 

data = DATA.read 

doc = Nokogiri::XML.parse data 
doc.xpath("//EventRouters/EventRouter").each do |event_router| 
    event_router.add_next_sibling("<EventRouter id='some'><Parameters>some content</Parameters></EventRouter>") 
end 

puts doc.to_xml 

__END__ 
<EventRouters> 
    <EventRouter>original1</EventRouter> 
    <EventRouter>original2</EventRouter> 
</EventRouters> 

는 결과가 실행 :

여기에, 기초에 대한 코드를 사용하여 내가 그것을 쓴 것 방법 NodeSet은 당신이 생각하는대로하지 않을 것입니다 :

doc = Nokogiri::XML.parse data 
ers = doc.search('EventRouter') 
ers << Nokogiri::XML::Node.new('<foo/>', doc) 

에 추가

doc.to_xml # => "<?xml version=\"1.0\"?>\n<EventRouters>\n <EventRouter>original1</EventRouter>\n <EventRouter>original2</EventRouter>\n</EventRouters>\n" 

대신이 세트의 말미에 추가 :하십시오 노드 집합입니다가, 세트의 모든 요소에 새로운 노드를 적용하지 않습니다

ers.to_xml # => "<EventRouter>original1</EventRouter><EventRouter>original2</EventRouter><<foo/>/>" 
1

변경

doc2=doc.xpath("//EventRouters/EventRouter") 

으로

doc2 = doc.at_xpath("//EventRouters") 

xpath은 배열을 반환합니다. at_xpath을 사용하여 첫 번째 요소를 가져올 수 있습니다. 또한 /EventRouter을 제거하십시오. 다른 'EventRouter'항목을 EventRouter에 추가하려고했기 때문에

+0

고맙습니다. 시도해 보겠습니다. – muski