Вопрос

У меня есть образец набора 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>Я не использую Objective-C</disclaimer>

Вы должны использовать XML Parser, не регулярные. XML не обычный язык, Следовательно, не легко пройден по регулярное выражение. Не делай этого.

Никогда не используйте регулярные выражения или базовый анализ строк для обработки XML. Анкет На каждом языке в настоящее время используется совершенно хорошая поддержка XML. XML является обманчиво сложным стандартом, и маловероятно, что ваш код будет правильным в том смысле, что он будет должным образом проанализировать все хорошо сформированные входные данные XML, и даже если это сделает, вы тратите свое время, потому что (как только что упоминалось) на каждом языке на Общее использование имеет поддержку XML. Это непрофессионально использовать регулярные выражения для анализа XML.

Вы могли бы использовать Эмигрант, с HASE Объективные привязки C..

Варианты Apple:

  1. А CF XML PARSER
  2. А Стоин какао на основе деревьев (только 10,4)

Without knowing your language or environment, here are some perl expressions. Hopefully it will give you the right idea for your application.

Your regular expression to capture the text content of a tag would look something like this:

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

This will capture the content in each tag. You will have to loop on the match to extract all content. Note that this does not account for self-terminated tags. You would need a regex engine with negative lookbehinds to accomplish that. Without knowing your environment, it's hard to say if it would be supported.

You could also just strip all tags from your source using something like:

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

Also depending on your environment, if you can use an XML-parsing library, it will make your life much easier. After all, by taking the regex approach, you lose everything that XML really offers you (structured data, context awareness, etc).

As others say, you should really be using NSXMLParser for this sort of thing.

HOWEVER, if you only need to extract the stuff in the name tags, then RegexKitLite can do it quite easily:

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

Careful about namespaces:

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

is equivalent XML that will break regexp based code. For XML, use an XML parser. XPath is your friend for things like this. The XPath code below will return a sequence of strings with the info you want:

./rsp/site/name/text()

Cocoa has NSXML support for XPath.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top