0

我使用 NSXMLParser 剖析一个 xml 包,我在包文本中收到 &apos。

我为 xmlParser 定义了以下内容:

[xmlParser setShouldResolveExternalEntities: YES];

永远不会调用以下方法

- (void)parser:(NSXMLParser *)parser foundExternalEntityDeclarationWithName:(NSString *)entityName publicID:(NSString *)publicID systemID:(NSString *)systemID

解析器不考虑 &apos 之前字段中的文本。

我正在寻找如何解决这个问题,有什么想法吗???

提前感谢亚历克斯

附上 XML 包部分:

<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:appwsdl"><SOAP-ENV:Body><ns1:getObjects2Response xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"><return xsi:type="tns:objectsResult"><totalRecipes xsi:type="xsd:string">1574</totalObjects><Objects xsi:type="tns:Item"><id xsi:type="xsd:string">4311</id><name xsi:type="xsd:string"> item title 1 </name><procedure xsi:type="xsd:string">item procedure 11......
4

2 回答 2

1

在参考了与此处不同的答案后,这就是我所做的。我用从 NSURLConnection 对象接收数据时替换&apos;了 xml 中所有出现的 。"'"然后我将该数据提供给解析器。

所以我要做的是:

NSData* parserData = [self resolveHTMLEntities: self.receivedData];
NSXMLParser* parser = [[NSXMLaParser alloc] initwithData:parserData];

这是 resolveHTMLEntitites 方法:

NSString *xmlCode = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSMutableString *temp = [NSMutableString stringWithString:xmlCode];

// Replace all the entities
[temp replaceOccurrencesOfString:@"&amp;apos;" withString:@"'" options:NSLiteralSearch range:NSMakeRange(0, [temp length])];

NSData *finalData = [temp dataUsingEncoding:NSUTF8StringEncoding];
return finalData;

问题是它&apos;被转换为&amp;apos;我们需要替换该事件的原因。

注意:上述代码块中没有执行内存管理。

希望这可以帮助。

于 2012-01-17T17:20:19.327 回答
0

标准实体是&lt;&gt;&amp;&quot;&apos;是一个 html 实体引用。您的 XML 是指 XHTML 名称空间还是已&apos;定义的其他名称空间?

(顺便说一句,很高兴看到 XML 的一小部分,包括标题。)

于 2009-11-20T18:45:06.430 回答