2011-08-10 2 views
-1

내 루비 스크립트에서 수정하고 저장해야하는 xml 파일이 있습니다. XML 파일은 `내가 <mtn:test-case title="Train-Consist-Message">에서 제공 <mtn:ttl>some other value</mtn:ttl><mtn:ttl>4</mtn:ttl>를 교체하고 저장해야 일치하는 항목을 찾은 후 ruby ​​파일의 문자열을 바꾸는 방법

<mtn:messages> 

<mtn:message correlation-key="0x" sequence="4"> 

    <mtn:header> 

    <mtn:protocol-version>0x4</mtn:protocol-version> 

    <mtn:message-type>0x0F04</mtn:message-type> 

    <mtn:ttl>4</mtn:ttl> 

    <mtn:qos-class-of-service>0</mtn:qos-class-of-service> 

    <mtn:qos-priority>2</mtn:qos-priority> 

     </mtn:header> 

</mtn:message> 

    </mtn:messages> 

</mtn:test-case> 

<mtn:test-case title="Train-Consist-Message"> 

<mtn:messages> 

<mtn:message correlation-key="0x" sequence="4"> 

    <mtn:header> 

    <mtn:protocol-version>0x4</mtn:protocol-version> 

    <mtn:message-type>0x0F04</mtn:message-type> 

    <mtn:ttl>4</mtn:ttl> 

    <mtn:qos-class-of-service>0</mtn:qos-class-of-service> 

    <mtn:qos-priority>2</mtn:qos-priority> 

     </mtn:header> 

</mtn:message> 

    </mtn:messages> 

</mtn:test-case>` 

같이 보입니다.

아래 코드로 작성했지만 모든 발생을 <mtn:ttl>4</mtn:ttl>으로 바꿉니다.

`doc = IO.read(ENV['CadPath1']+ "conf\\cad-mtn-config.xml") 
doc.gsub!(pattern, str) 
File.open("File path", "w"){|fh| fh.write(doc)}` 

제발 도와주세요. 빠른 회신을 기다리는 중 ...

+3

패턴 (표시되지 않음)이 잘못되었을 가능성이 있습니다. 또한 XML 문서를 구문 분석하기 위해 정규식을 사용하지 않을 것입니다. –

답변

1

String#gsub!은 교체가 지정된 모두 인스턴스를 바꾸어 현재 위치에서 문자열을 수정합니다. 첫 번째 인스턴스 만 바꾸려면 String#sub 또는 String.sub!을 사용하십시오.

1

gsub 대신 sub을 사용하는 것에 대한 마이크의 제안이 좋습니다. 그러나 XML (및 HTML)을 정규 표현식으로 파싱하는 것은 대개 싫은 일입니다.

귀하의 질문에 나는 부모 - 자식 관계의 관점에서 수정 된 요소를 찾은 것으로 가정합니다 (즉, 소스 코드 순서와 관련해서는 다음과 같이 말할 수 없습니다 : "두 번째 발생 수정 이 패턴의 "), 따라서 신뢰할 수있는 신뢰할 수있는 을 발명하는 것은 매우, 매우 어려울 수 있습니다.

변경하려는 요소를 찾으려면 구문 분석기 라이브러리를 사용해야합니다. 꽤 큰 컬렉션이 있습니다. 그들 중 일부를 http://ruby-toolbox.com/categories/html_parsing.html에서보고 하나를 선택하거나 빌트인 REXML 라이브러리를 사용하십시오.

또는 레일스의 ActionController (action_controller/vendor/html-scanner.rb)에 포함 된 매우 간단한 'html-scanner'모듈을 사용할 수도 있지만 레일스를 사용하지 않는다면 확실하지 않습니다 추출 여부는 시간 가치가 있습니다.

정확한 코드는 선택한 파서에 따라 다릅니다. 보통 그들은 꽤 좋은 문서/튜토리얼을 가지고 있으므로, 당신이 그것을 처리 할 수있을 것이라고 확신합니다.

+0

XML에 대해 찾기 및 바꾸기 문자열 작업을 실행하려는 경우 100 % 동의하십시오. 그런 다음 잘못했을 가능성이 큽니다 (YDIW를 편리한 지름길로 사용해야합니까? btw? Just Googled : 명백하게 우리는한다). 그러나 그것은 큰 주제이기 때문에, 나는 자신의 특정한'gsub' /'sub' 오해를 고의적으로 제한했다 ;-) –

관련 문제