2009-11-15 6 views
0

내 가치를 다시 반환정규식 내가 XML의 샘플 세트를 태그

<rsp stat="ok"> 
    <site> 
    <id>1234</id> 
    <name>testAddress</name> 
    <hostname>anotherName</hostname> 
    ... 

    </site> 
    <site> 
    <id>56789</id> 
    <name>ba</name> 
    <hostname>alphatest</hostname> 
    ... 
    </site> 
</rsp> 

내가 <name></name> 내에서 모든 것을 추출 할 수 있지만 태그 자체가, 그리고 가지고 그 첫 번째 예를 들어 (또는 다른 테스트를 기반으로 어떤 항목을 선택하십시오).

정규식에서 가능합니까?

+7

해당 언어로 xml 파싱 라이브러리를 사용할 수 있습니까? regex에서는 가능하지만 XML 라이브러리를 사용하는 것이 훨씬 쉽고 효율적입니다. – Bartek

+0

또한 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – voyager

답변

1

이러한 종류의 작업에 가장 적합한 도구는 XPath입니다.

NSURL *rspURL = [NSURL fileURLWithPath:[@"~/rsp.xml" stringByExpandingTildeInPath]]; 
NSXMLDocument *document = [[[NSXMLDocument alloc] initWithContentsOfURL:rspURL options:NSXMLNodeOptionsNone error:NULL] autorelease]; 

NSArray *nodes = [document nodesForXPath:@"/rsp/site[1]/name" error:NULL]; 
NSString *name = [nodes count] > 0 ? [[nodes objectAtIndex:0] stringValue] : nil; 

id가 56789 인 사이트의 이름을 원하면이 XPath : /rsp/site[id='56789']/name을 대신 사용하십시오. XPath 구문에 대한 간단한 개요는 W3Schools XPath tutorial을 읽어 보시기 바랍니다.

2

귀하의 언어 나 환경을 모른 채 여기에 몇 가지 perl 표현이 있습니다. 잘하면 응용 프로그램에 대한 올바른 아이디어를 줄 수 있기를 바랍니다.

귀하의 정규 표현식은 다음과 같이 보일 것이다 태그의 텍스트 내용을 캡처 :

m/>([^<]*)</ 

이 각 태그의 내용을 캡처합니다. 모든 내용을 추출하려면 일치 항목을 반복해야합니다. 이 태그는 자체 종료 태그를 설명하지 않습니다. 이를 달성하려면 부정적인 lookbehinds가있는 정규식 엔진이 필요합니다. 환경을 알지 못하면 지원 될지 여부를 말하기가 어렵습니다.

또한처럼 뭔가를 사용하여 소스에서 모든 태그를 제거 할 수 : 또한 환경에 따라

s/<[^>]*>//g 

, 당신은 XML 파싱 라이브러리를 사용할 수 있다면, 그것은 당신의 인생을 훨씬 쉽게 만들 것입니다. 결국, 정규식 접근 방식을 취함으로써 XML이 실제로 제공하는 모든 것을 잃게됩니다 (구조화 된 데이터, 컨텍스트 인식 등).

+0

예 Objective-C를 사용하려고합니다. 추가 라이브러리 또는 파일을 추가하고 싶지 않았습니다. xml 문자열에 대한 간단한 방법이있을 것이라고 생각했습니다. – Doz

+1

+1 XML 파서를 사용할 때 유용한 조언이 있습니다. – TrueWill

3

<disclaimer> 나는 당신이 XML parser, not regexes를 사용한다 오브젝티브 C를 </disclaimer>

를 사용하지 마십시오. XML is not a regular language, hence not easely parseable, a regular expression. Don't do it.

Never use regular expressions or basic string parsing to process XML. 현재 공통적으로 사용되는 모든 언어는 완벽한 XML 지원을 제공합니다. XML은 믿을 수 없을만큼 복잡한 표준이며 올바른 형식의 모든 XML 입력을 올바르게 구문 분석한다는 점에서 코드가 정확할 것 같지 않으며 그럴 경우에도 (모든 언어로 언급했기 때문에) 시간이 낭비됩니다. 일반적인 사용에는 XML 지원이 있습니다. 정규식을 사용하여 XML을 구문 분석하는 것은 전문가가 아닙니다.

Expat을 사용하고 Objective C bindings을 사용할 수 있습니다.

Apple's options are

:

  1. CF xml parser
  2. 다른 사람, 당신은 정말 이런 종류의에 대한 NSXMLParser을 사용해야 말하는 것처럼 tree based Cocoa parser (10.4 only)
1

.당신이 이름 태그에 물건을 추출해야, 다음 RegexKitLite은 아주 쉽게 할 수 있다면

그러나이 : ​​네임 스페이스에 대한

NSString * xmlString = ...; 
NSArray * captures = [xmlString arrayOfCaptureComponentsMatchedByRegex:@"<name>(.*?)</name>"]; 
for (NSArray * captureGroup in captures) { 
    NSLog(@"Name: %@", [captureGroup objectAtIndex:1]; 
} 
0

주의 :

<prefix:name xmlns:prefix="">testAddress</prefix:name> 

는 해당 XML입니다 regexp 기반 코드를 깨뜨릴 것입니다. XML의 경우 XML 구문 분석기를 사용하십시오. XPath는 이와 같은 것들을위한 당신의 친구입니다. 는 XPath 코드는 아래에 원하는 정보와 문자열의 순서를 반환합니다

./rsp/site/name/text() 

코코아 NSXML support for XPath있다.