objective-c – 如何使用NSXMLParser解析内部声明的XML实体引用

objective-c – 如何使用NSXMLParser解析内部声明的XML实体引用,第1张

概述我有一个使用内部声明的实体的 XML文件.例如: <?xml version="1.0" encoding="UTF-8"?>...<!ENTITY my_symbol "my symbol value">...<my_element> <my_next_element>foo&my_symbol;bar</my_next_element></my_element>. 我有一个使用内部声明的实体的 XML文件.例如:

<?xml version="1.0" enCoding="UTF-8"?>...<!ENTITY my_symbol "my symbol value">...<my_element>    <my_next_element>foo&my_symbol;bar</my_next_element></my_element>...

使用NSXMLParser类,我如何解析my_symbol实体引用

从实验中,解析器:foundInternalEntityDeclarationWithname:value:将为my_symbol实体声明调用delegate方法,其值为“my symbol value”.然后,当到达my_next_element元素时,NSXMLParser将调用解析器:dIDStartElement:namespaceURI:qualifIEdname:attributes:delegate方法.

在解析器:dIDEndElement:namespaceURI:qualifIEdname:为< / my_next_element>调用之前,解析器:foundCharacters:delegate方法将使用字符串调用两次:

>“foo”
>“酒吧”

my_symbol实体引用将被忽略.为了解析实体引用需要什么?

编辑:

从DTD中删除my_symbol的ENTITY声明将导致NSXMLParserUndeclaredEntityError.这表明当实体声明存在,然后在< my_next_element>中引用时,它就会被注意到.出于某种原因,它只是没有被解析为它所代表的字符串.

另外,如果& amp;在元素中使用,解析器将正确地将其解析为“&”当调用解析器:foundCharacters:delegate方法时,这将作为字符串传递.

解决方法 我查看了NSXMLParser.h,它列出了以下为委托支持的已定义方法:

@interface NSObject (NSXMLParserDelegateEventAdditions)// document handling methods- (voID)parserDIDStartdocument:(NSXMLParser *)parser;    // sent when the parser begins parsing of the document.- (voID)parserDIDEnddocument:(NSXMLParser *)parser;    // sent when the parser has completed parsing. If this is encountered,the parse was successful.// DTD handling methods for varIoUs declarations.- (voID)parser:(NSXMLParser *)parser foundNotationDeclarationWithname:(Nsstring *)name publicID:(Nsstring *)publicID systemID:(Nsstring *)systemID;- (voID)parser:(NSXMLParser *)parser foundUnparsedEntityDeclarationWithname:(Nsstring *)name publicID:(Nsstring *)publicID systemID:(Nsstring *)systemID notationname:(Nsstring *)notationname;- (voID)parser:(NSXMLParser *)parser foundAttributeDeclarationWithname:(Nsstring *)attributename forElement:(Nsstring *)elementname type:(Nsstring *)type defaultValue:(Nsstring *)defaultValue;- (voID)parser:(NSXMLParser *)parser foundElementDeclarationWithname:(Nsstring *)elementname model:(Nsstring *)model;- (voID)parser:(NSXMLParser *)parser foundInternalEntityDeclarationWithname:(Nsstring *)name value:(Nsstring *)value;- (voID)parser:(NSXMLParser *)parser foundExternalEntityDeclarationWithname:(Nsstring *)name publicID:(Nsstring *)publicID systemID:(Nsstring *)systemID;- (voID)parser:(NSXMLParser *)parser dIDStartElement:(Nsstring *)elementname namespaceURI:(Nsstring *)namespaceURI qualifIEdname:(Nsstring *)qname attributes:(NSDictionary *)attributeDict;    // sent when the parser finds an element start tag.    // In the case of the cvslog tag,the following is what the delegate receives:    //   elementname == cvslog,namespaceURI == http://xml.apple.com/cvslog,qualifIEdname == cvslog    // In the case of the radar tag,the following is what's passed in:    //    elementname == radar,namespaceURI == http://xml.apple.com/radar,qualifIEdname == radar:radar    // If namespace processing >isn't< on,the xmlns:radar="http://xml.apple.com/radar" is returned as an attribute pair,the elementname is 'radar:radar' and there is no qualifIEdname.- (voID)parser:(NSXMLParser *)parser dIDEndElement:(Nsstring *)elementname namespaceURI:(Nsstring *)namespaceURI qualifIEdname:(Nsstring *)qname;    // sent when an end tag is encountered. The varIoUs parameters are supplIEd as above.- (voID)parser:(NSXMLParser *)parser dIDStartMapPingPrefix:(Nsstring *)prefix toURI:(Nsstring *)namespaceURI;    // sent when the parser first sees a namespace attribute.    // In the case of the cvslog tag,before the dIDStartElement:,you'd get one of these with prefix == @"" and namespaceURI == @"http://xml.apple.com/cvslog" (i.e. the default namespace)    // In the case of the radar:radar tag,before the dIDStartElement: you'd get one of these with prefix == @"radar" and namespaceURI == @"http://xml.apple.com/radar"- (voID)parser:(NSXMLParser *)parser dIDEndMapPingPrefix:(Nsstring *)prefix;    // sent when the namespace prefix in question goes out of scope.- (voID)parser:(NSXMLParser *)parser foundCharacters:(Nsstring *)string;    // This returns the string of the characters encountered thus far. You may not necessarily get the longest character run. The parser reserves the right to hand these to the delegate as potentially many calls in a row to -parser:foundCharacters:- (voID)parser:(NSXMLParser *)parser foundIgnorableWhitespace:(Nsstring *)whitespaceString;    // The parser reports ignorable whitespace in the same way as characters it's found.- (voID)parser:(NSXMLParser *)parser foundProcessingInstructionWithTarget:(Nsstring *)target data:(Nsstring *)data;    // The parser reports a processing instruction to you using this method. In the case above,target == @"xml-stylesheet" and data == @"type='text/CSS' href='cvslog.CSS'"- (voID)parser:(NSXMLParser *)parser foundComment:(Nsstring *)comment;    // A comment (Text in a <!-- --> block) is reported to the delegate as a single string- (voID)parser:(NSXMLParser *)parser foundcdaTA:(NSData *)cdaTABlock;    // this reports a cdaTA block to the delegate as an NSData.- (NSData *)parser:(NSXMLParser *)parser resolveExternalEntityname:(Nsstring *)name systemID:(Nsstring *)systemID;    // this gives the delegate an opportunity to resolve an external entity itself and reply with the resulting data.- (voID)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;    // ...and this reports a Fatal error to the delegate. The parser will stop parsing.- (voID)parser:(NSXMLParser *)parser valIDationErrorOccurred:(NSError *)valIDationError;    // If valIDation is on,this will report a fatal valIDation error to the delegate. The parser will stop parsing.@end

根据文件中条目的顺序,它看起来找到的声明方法应该在找到元素之前发生(如你所发现的).我会尝试处理所有这些方法并查看是否有任何方法,但它们看起来都像是为其他用途而设计的.

我想知道是否有办法检测发送给您的委托的所有未处理的消息,以防文档/接口不完整.

总结

以上是内存溢出为你收集整理的objective-c – 如何使用NSXMLParser解析内部声明的XML实体引用全部内容,希望文章能够帮你解决objective-c – 如何使用NSXMLParser解析内部声明的XML实体引用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1016349.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存