2014-02-14 27 views
3

我有這樣的XML,它聲明內部實體n的NSXMLParser不解決內部實體

NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<!DOCTYPE JMdict [<!ENTITY n \"noun\">]> 
    <JMdict> 
     <entry> 
      <sense> 
       <pos>&n;</pos> 
       <gloss>love</gloss> 
      </sense> 
     </entry> 
    </JMdict>"; 

,並使用NSXMLParser解析它

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding]]; 
[parser setDelegate:self]; 
[parser parse]; 

,我實現委託方法

- (void)parser:(NSXMLParser *)parser foundInternalEntityDeclarationWithName:(NSString *)name value:(NSString *)value { 
    NSLog(@"foundInternalEntityDeclarationWithName: %@ = %@", name, value); 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    NSLog(@"<%@>", elementName); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    NSLog(@"</%@>", elementName); 
} 

- (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI { 
    NSLog(@"didStartMappingPrefix %@ %@", prefix, namespaceURI); 
} 

- (void)parser:(NSXMLParser *)parser didEndMappingPrefix:(NSString *)prefix { 
    NSLog(@"didEndMappingPrefix %@", prefix); 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    NSLog(@"\t%@", string); 
} 

- (void)parser:(NSXMLParser *)parser foundIgnorableWhitespace:(NSString *)whitespaceString { 
    NSLog(@"foundIgnorableWhitespace %@", whitespaceString); 
} 

- (void)parser:(NSXMLParser *)parser foundProcessingInstructionWithTarget:(NSString *)target data:(NSString *)data { 
    NSLog(@"foundProcessingInstructionWithTarget %@", target); 
} 

- (void)parser:(NSXMLParser *)parser foundComment:(NSString *)comment { 
    NSLog(@"foundComment %@", comment); 
} 

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock { 
    NSLog(@"foundCDATA"); 
} 

- (NSData *)parser:(NSXMLParser *)parser resolveExternalEntityName:(NSString *)name systemID:(NSString *)systemID { 
    NSLog(@"resolveExternalEntityName %@ %@", name, systemID); 
    return nil; 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 
    NSLog(@"Error %@", parseError); 
} 

但是&n;未解決。簡單地空白。我做錯了什麼?

輸出解析:

2014-02-15 01:09:16.579 TestNSXMLParser[76939:303] foundInternalEntityDeclarationWithName: n = noun 
2014-02-15 01:09:16.580 TestNSXMLParser[76939:303] <JMdict> 
2014-02-15 01:09:16.581 TestNSXMLParser[76939:303] <entry> 
2014-02-15 01:09:16.581 TestNSXMLParser[76939:303] <sense> 
2014-02-15 01:09:16.582 TestNSXMLParser[76939:303] <pos> 
2014-02-15 01:09:16.582 TestNSXMLParser[76939:303] </pos> 
2014-02-15 01:09:16.582 TestNSXMLParser[76939:303] <gloss> 
2014-02-15 01:09:16.583 TestNSXMLParser[76939:303] love 
2014-02-15 01:09:16.583 TestNSXMLParser[76939:303] </gloss> 
2014-02-15 01:09:16.583 TestNSXMLParser[76939:303] </sense> 
2014-02-15 01:09:16.584 TestNSXMLParser[76939:303] </entry> 
2014-02-15 01:09:16.584 TestNSXMLParser[76939:303] </JMdict> 

回答

0

任何原因,你有一個反斜槓「\」在你的實體定義的值(「名詞」)?

<!ENTITY n \"noun\">] 

內部實體聲明的XML語法如下:

<!ENTITY entity-name "entity-value"> 

來自各地的「名詞」刪除反斜槓,然後再試一次。

+0

反斜槓是爲了逃避雙引號,導致XML字符串是NSString。當我使用XML文件作爲輸入時,沒有反斜槓,但實體仍未解析。 –