2009-11-15 134 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解析庫?這對於正則表達式來說確實是可能的,但是您可能會發現使用XML庫更容易和更高效。 – Bartek 2009-11-15 05:41:55

+0

另外,請參閱http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – voyager 2009-11-16 23:09:50

回答

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代替。我建議您閱讀W3Schools XPath tutorial以快速瀏覽XPath語法。

2

不知道你的語言或環境,這裏有一些perl表達式。希望它會給你的應用程序正確的想法。

你的正則表達式來捕獲標籤的文字內容會是這個樣子:

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

這將捕獲每個標籤的內容。您必須循環匹配以提取所有內容。請注意,這不包括自我終止的標籤。你需要一個帶有負向後視的正則表達式來實現這一點。不知道你的環境,很難說它是否會得到支持。

您也可以使用像只剝去你的源中的所有標籤:

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

而且根據您的環境,如果你可以使用一個XML解析庫,它會讓你的生活變得更輕鬆。畢竟,通過採用正則表達式的方法,您會失去XML真正爲您提供的一切(結構化數據,上下文感知等)。

+0

是的,我正在嘗試使用Objective-C。我不想添加任何額外的庫或文件,我想也許會有一個簡單的方法來獲得一個xml字符串,我得到返回 – Doz 2009-11-15 05:49:16

+1

+1爲使用XML解析器的優秀建議。 – TrueWill 2009-11-15 05:55:52

3

<disclaimer>我不使用Objective-C的</disclaimer>

你應該使用XML parsernot regexesXML is not a regular languagehence not easely parseable,作者:a regular expressionDon'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. tree based Cocoa parser (10.4 only)
1

至於別人說,你真的應該使用NSXMLParser對於這樣的事情。

但是,如果你需要提取的東西,在標籤的名稱,然後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這將打破基於正則表達式的代碼。對於XML,請使用XML解析器。 XPath是你這樣的朋友的朋友。下面的代碼的XPath會返回一個字符串的序列與你想要的信息:

./rsp/site/name/text() 

可可有NSXML support for XPath