タグ内で値を取得するための正規表現
-
20-09-2019 - |
質問
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>
ただし、タグ自体ではなく、最初のインスタンスのみを使用するために(または他のテストに基づいています)。
これは正規表現で可能ですか?
解決
この種のタスクに最適なツールはです 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パーサー, 正規性ではありません. XMLは正常な言語ではありません, したがって、容赦なく断片化できません に 正規表現. それをしないでください.
正規表現や基本的な文字列解析を使用してXMLを処理しないでください. 。一般的な使用のすべての言語は現在、完全に優れたXMLサポートを持っています。 XMLは一見複雑な標準であり、すべてのよく形成されたXML入力を適切に解析するという意味で、コードが正しいことはありそうにありません。一般的な使用法にはXMLサポートがあります。 XMLを解析するために正規表現を使用することは専門家ではありません。
使用できます 外国人, 、持っています 目的Cバインディング.
あなたの言語や環境を知らずに、ここにいくつかのPerlの表現があります。うまくいけば、それがあなたのアプリケーションに正しいアイデアを与えることを願っています。
タグのテキストコンテンツをキャプチャするためのあなたの正規表現は、次のようになります。
m/>([^<]*)</
これにより、各タグのコンテンツがキャプチャされます。すべてのコンテンツを抽出するには、試合でループする必要があります。これは自己終了タグを考慮していないことに注意してください。それを達成するには、ネガティブルックベヒンドを備えた正規表現エンジンが必要です。あなたの環境を知らなければ、それがサポートされるかどうかを言うのは難しいです。
次のようなものを使用して、ソースからすべてのタグを削除することもできます。
s/<[^>]*>//g
また、環境に応じて、XML-Parsingライブラリを使用できれば、あなたの生活がはるかに楽になります。結局のところ、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はこのようなもののためのあなたの友達です。以下のXathコードは、必要な情報を含む一連の文字列を返します。
./rsp/site/name/text()
ココアは持っています XPathのNSXMLサポート.