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>し、最初のインスタンスに対してのみ(または他のテストに基づいてどの項目を選択するか)それを取得したいと思います。

これは正規表現で可能ですか?

4

5 に答える 5

3

<disclaimer>私はObjective-Cを使用していません</disclaimer>

正規表現ではなく、 XMLパーサーを使用する必要があります。XMLは正規言語ではないため、正規表現で簡単に解析することはできません。しないでください

XMLの処理に正規表現や基本的な文字列解析を使用しないでください。現在一般的に使用されているすべての言語は、完全に優れたXMLサポートを備えています。XMLは一見複雑な標準であり、すべての整形式XML入力を適切に解析するという意味でコードが正しいとは考えられません。たとえそうだとしても、(今述べたように)すべての言語が一般的な使用法はXMLをサポートしています。XMLを解析するために正規表現を使用することは専門的ではありません。

Expatを使用できます。ObjectiveCバインディングがあります。

Appleのオプションは次のとおりです。

  1. CFxmlパーサー
  2. ツリーベースのCocoaパーサー(10.4のみ)
于 2009-11-15T06:10:39.823 に答える
2

あなたの言語や環境を知らなくても、ここにいくつかのperl式があります。うまくいけば、それはあなたにあなたのアプリケーションのための正しい考えを与えるでしょう。

タグのテキストコンテンツをキャプチャするための正規表現は、次のようになります。

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

これにより、各タグのコンテンツがキャプチャされます。すべてのコンテンツを抽出するには、一致をループする必要があります。これは自己終了タグを考慮していないことに注意してください。これを実現するには、ネガティブルックビハインドを備えた正規表現エンジンが必要になります。あなたの環境を知らなければ、それがサポートされるかどうかを言うのは難しいです。

次のようなものを使用して、ソースからすべてのタグを削除することもできます。

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

また、環境によっては、XML解析ライブラリを使用できれば、作業がはるかに楽になります。結局のところ、正規表現アプローチを採用することで、XMLが実際に提供するすべてのもの(構造化データ、コンテキスト認識など)が失われます。

于 2009-11-15T05:41:55.460 に答える
1

他の人が言うように、あなたは本当にNSXMLParserこの種のものに使うべきです。

ただし、名前タグの内容を抽出するだけでよい場合は、 RegexKitLiteで簡単に抽出できます。

NSString * xmlString = ...;
NSArray * captures = [xmlString arrayOfCaptureComponentsMatchedByRegex:@"<name>(.*?)</name>"];
for (NSArray * captureGroup in captures) {
  NSLog(@"Name: %@", [captureGroup objectAtIndex:1];
}
于 2009-11-15T06:26:24.607 に答える
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のサイトの名前が必要な場合は、/rsp/site[id='56789']/name代わりに次のXPath:を使用してください。XPath構文の概要については、W3SchoolsXPathチュートリアルを読むことをお勧めします。

于 2009-12-23T17:04:28.910 に答える
0

名前空間に注意してください:

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

正規表現ベースのコードを壊す同等のXMLです。XMLの場合、XMLパーサーを使用します。XPathは、このようなことの友です。以下のXPathコードは、必要な情報を含む一連の文字列を返します。

./rsp/site/name/text()

CocoaはXPathをNSXMLでサポートしています。

于 2009-11-15T06:54:21.973 に答える