2014-02-13 2 views
0

큰 XML 파일이 있습니다. 몇 가지 문제를 해결하고 XML 파일에서 특정 노드를 추출하고 싶습니다. 나는 SimpleXML 객체를 원하지 않는다. 내가 원한 문자열 (bash/sed/php에 게시)과 일치하는 새로운 파일을 만들고 싶다.일반 텍스트 XML 노드를 추출하는 정규식

<?xml version="1.0" encoding="UTF-8"?> 
<definition></definition> 
    <metadata></metadata> 
    <nodeToRegex> 
     <nodeImightwant> 
      <subnode> 
       <subsubnode1></subsubnode1> 
       <subsubnodeToCheck>stringCheck</subnodeToCheck> 
       <subsubnode2></subsubnode2> 
      </subnode> 
     </nodeImightwant> 
     <nodeImightwant></nodeImightwant> 
     <nodeImightwant></nodeImightwant> 
    </nodeToRegex> 

그래서이 XML 파일에서 nodeToRegex를 제외한 모든 노드의 모든 라인을 원합니다. nodeToRegex에서 stringCheck 문자열이 "aValidString"과 같으면 nodeImightwant 만 원한다. 정규식을 통해이 작업을 수행 할 수 있습니까? 아니면 파일에서 항목을 복사하여 붙여 넣기해야합니까? (나의 정규 기술은 subpar이다)

+1

을 여러 가지 이유를 들어 (찾아 * 예를 들어, Cthulhu regex *)를 사용하여 정규식을 사용하여 XML을 파싱하는 것은 좋은 생각이 아닙니다. 유지 보수가 어려우며 신속하게 손에서 벗어납니다. 쉽게 사용할 수있는 수많은 잘 검증 된 XML 구문 분석 솔루션 중 하나를 사용하는 것이 좋습니다. – Nit

답변

1

Don't parse XML with regexes. SimpleXML을 사용하여 데이터를 재 패키징/재 배열 할 수는 없지만 정규 표현식을 사용하여 데이터를 재 작성하려는 시도는 많은 골칫거리와 궁극적으로 깨진 코드를위한 방법입니다.

See this classic example 왜 regexes로 XML/HTML/XHTML을 분석하는 것이 광기의 길인지에 대한 이유입니다.

당신이 정규식을 사용하여 주장하는 경우에, 다만 다음과 같이 원하지 않는 노드를 대체 :

$myxml = preg_replace('~<nodeToRegex>.*?</nodeToRegex>~', '', $myxml); 

Regular expression visualization

Debuggex Demo

+0

파일을 읽고 노드를 반복하면서 내가 관심있는 것들만 추출 할 때까지 나는 RegEx로 파싱을 실제로하지 않았다. 나는이 노드를 추출하여 작업 가져 오기 도구를 얻는다. 벌금). 그리고 SimpleXML, FWIW로 수입업자 섹션을 만들었습니다. – user3258505

관련 문제