2013-05-20 3 views
0

위대한 xml 파싱 모듈이 있다는 것을 알고 있습니다 만, 사용하기 전에 자신 만의 매우 단순한 모듈을 작성하려고합니다.XML 태그를 닫은 후 새 줄을 추가하십시오.

내가 원하는 것은 닫는 태그가 끝에 줄 바꿈 문자를 갖기를 원합니다. gsub을 사용하여 닫는 태그를 개조 할 수있게 해주는 몇 가지 방법을 시도했습니다. 실제로는 개행하지 않은 XML 형식의 단락에서 읽을 수있는 형식을 만들어줍니다. 나는 기존의 정규 표현식에 "\ n"을 덧붙이거나 일치 된 값을 변수에 저장하고 개행 문자를 다시 삽입하는 방법을 아직 이해할 수 없다.

XML 구문 분석 모듈은 내가하는 것보다 훨씬 훌륭한 작업을 수행 할 것이라는 것을 알고 있지만, 적어도 내 논리가 올바른 길인지, 아니면 더 나은 것이 있는지보고 싶습니다. (처음부터) 길.

+1

O.M.G., 특히 정규식을 사용하려고 시도하지 마십시오. 들어오는 XML 콘텐트를 100 % 제어 할 수 있다면, XML을 작동시킬 기회가 있을지 모르지만 XML의 경우 XML을 사용하면 코드가 손상 될 수 있습니다. http://stackoverflow.com/questions/1768223/ruby-regexp-to-extract-specific-elements-in-an-xml-string/16654826#16654826 –

답변

0

gsub는 충분히 좋은 솔루션입니다 : 그것은 어려운 방법을 할 싶은

xml.gsub(/(<\/[^>]+>)/, '\1\n') 
+0

닫기지만 아주 많지 않음 : '']> '.gsub (/ (<\/[^>] +>) /'\ 1 \ n ') = > " \\ N]> \\ n "'. 태그는 줄을 넘을 수 있고 흰 공백이있을 수 있음을 기억하십시오. –

2

이 훌륭한이며, 모든 프로그래머가 적어도 한 번하지 무언가하지만 정말 오류가 발생하기 쉬운입니다.

덜 번거 로움이 많은 멀리 길 아래에 훨씬 당신을 얻을 것이기 때문에 정말 파서에 건물을 권하고 싶습니다 :

보이는
require 'nokogiri' 
doc = Nokogiri::XML(<<EOT) 
<xml><t1/><t2>foo</t2></xml> 
EOT 

doc.each do |node| 
    node.replace(node.to_s << "\n") unless node.text? 
end 

puts doc.to_xml 

같은 :

<?xml version="1.0"?> 
<xml> 
    <t1/> 
    <t2>foo</t2> 
</xml> 

순진한 "나는 패턴 함께 할 것"접근 방식의 문제는 당신이 CDATA 블록으로 실행할 수있다 :

<![CDATA[ This can contain > < " & <foo></bar> ]]> 

패턴을 사용하여 태그 사이에 삽입 된 일부 XML을 처리 한 다음 문제를 해결하기 위해 코드를 작성하는 데 걸리는 시간을 확인하거나 완료된 손상을 푸십시오. 그러면 혐오감을 포기할 수 있습니다.

관련 문제