문제

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> 그러나 태그 자체가 아니며 첫 번째 인스턴스에 대해서만 (또는 다른 테스트를 기준으로하는 경우)

Regex에서 가능합니까?

도움이 되었습니까?

해결책

이런 종류의 작업에 가장 적합한 도구는입니다 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 대신에. 나는 당신이 읽는 것이 좋습니다 W3Schools xpath 튜토리얼 XPath 구문의 빠른 개요.

다른 팁

<disclaimer>나는 목표 c를 사용하지 않습니다</disclaimer>

당신은 an을 사용해야합니다 XML 파서, 정규식이 아닙니다. XML은 일반 언어가 아닙니다, 따라서 쉽게 구분할 수있는 것은 아닙니다 ~에 의해 정규 표현. 하지 마십시오.

XML을 처리하기 위해 일반 표현식 또는 기본 문자열 구문 분석을 사용하지 마십시오.. 현재 공통 사용의 모든 언어는 현재 XML 지원이 완벽합니다. XML은 기만적으로 복잡한 표준이며, 잘 형성된 모든 XML 입력을 올바르게 구문 분석 할 것이라는 점에서 코드가 올바르게 될 것 같지 않습니다. 일반적인 사용에는 XML 지원이 있습니다. 정규 표현식을 사용하여 XML을 구문 분석하는 것은 비전문가입니다.

당신은 사용할 수 있습니다 국외 거주자, 객관적인 C 바인딩.

Apple의 옵션이 있습니다:

  1. 그만큼 CF XML 파서
  2. 그만큼 나무 기반 코코아 파서 (10.4 만 해당)

언어 나 환경을 알지 못하면 여기에는 몇 가지 Perl 표현이 있습니다. 바라건대 그것은 당신에게 당신의 응용 프로그램에 대한 올바른 아이디어를 줄 것입니다.

태그의 텍스트 내용을 캡처하기위한 정규 표현식은 다음과 같습니다.

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

이것은 각 태그의 내용을 캡처합니다. 모든 컨텐츠를 추출하려면 경기에서 루프해야합니다. 이것은 자체 종료 태그를 설명하지 않습니다. 이를 달성하려면 부정적인 외관이있는 Regex 엔진이 필요합니다. 당신의 환경을 알지 못하면 그것이 지원 될 것인지 말하기는 어렵습니다.

다음과 같은 것을 사용하여 소스에서 모든 태그를 제거 할 수도 있습니다.

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

또한 환경에 따라 XML 패싱 라이브러리를 사용할 수 있다면 인생이 훨씬 쉬워집니다. 결국, Regex 접근법을 취함으로써 XML이 실제로 제공하는 모든 것을 잃어 버립니다 (구조화 된 데이터, 컨텍스트 인식 등).

다른 사람들이 말했듯이, 당신은 실제로 사용해야합니다 NSXMLParser 이런 종류의 일을 위해.

그러나 당신이 있다면 이름 태그로 물건을 추출해야합니다. Regexkitlite 아주 쉽게 할 수 있습니다 :

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

네임 스페이스에주의를 기울여

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

Regexp 기반 코드를 중단하는 동등한 XML입니다. XML의 경우 XML 파서를 사용하십시오. XPath는 이런 일의 친구입니다. 아래의 XPath 코드는 원하는 정보로 일련의 문자열을 반환합니다.

./rsp/site/name/text()

코코아가 있습니다 XPath에 대한 NSXML 지원.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top