- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个使用内部声明实体的 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
实体引用?
根据实验,parser:foundInternalEntityDeclarationWithName:value:
将为 my_symbol
调用委托(delegate)方法实体声明,有值 "my symbol value"
.然后,当 my_next_element
达到元素,NSXMLParser
将调用 parser:didStartElement:namespaceURI:qualifiedName:attributes:
委托(delegate)方法。
之前parser:didEndElement:namespaceURI:qualifiedName:
要求</my_next_element>
, parser:foundCharacters:
委托(delegate)方法将使用字符串调用两次:
"foo"
"bar"
my_symbol
实体引用被忽略。解析实体引用需要什么?
编辑:
删除 ENTITY
my_symbol
声明来自 DTD 的结果将是 NSXMLParserUndeclaredEntityError
.这表明当存在实体声明时,然后在 <my_next_element>
中引用,它正在被注意到。由于某种原因,它只是没有被解析为它所代表的字符串。
此外,如果 &
在元素中使用,解析器会将其正确解析为 "&"
当 parser:foundCharacters:
时,它作为字符串传递委托(delegate)方法被调用。
最佳答案
我查看了 NSXMLParser.h,其中列出了以下定义的委托(delegate)支持方法:
@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
根据文件中条目的顺序,找到的声明方法看起来应该在找到元素之前发生(如您所见)。我会尝试处理所有这些方法,看看它们是否会出现,但它们看起来都像是为其他用途而设计的。
我想知道是否有一种方法可以检测发送给您的委托(delegate)的所有未处理消息,以防文档/接口(interface)不完整。
关于objective-c - 如何使用 NSXMLParser 解析内部声明的 XML 实体引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1541267/
都是整数,但一直报错 "Only assignment, call, increment, decrement, await, and new object expressions can be us
我有以下情况:一个“对话”实体/表,它有多个关联的标签。Tag 也是一个实体/表 - key/id 是 tagName(一个字符串)。 在客户端 (javascript),我在处理标签时使用字符串数组
我想通过 maven java 源代码生成器自动生成 java 源代码。我想通过查看一个大实体 xml 文件来创建实体类,该文件将包含系统中的所有实体和实体关系。据我搜索,目前maven中没有这样的插
我有一段时间有这个疑问,有人说 EJB 3.0 中没有所谓的实体 bean。有没有可能这样说,EJB 3.0 使用 JPA 来持久化数据并且没有对以前版本(EJB 2.1)中的实体 bean 进行增强
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
实体(entites) 用于定义引用普通文本或特殊字符的快捷方式的变量,可在内部或外部进行声明 实体引用是对实体的引用 声明一个内部实体 语法: <!ENTITY 实体名称 "
This page建议 !ENTITY: If you want to avoid duplication, consider using XML entities (for example, [ ]
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我使用 Symfony2 和 Doctrine,我有一个关于实体的问题。 出于性能方面的考虑,我想知道是否可以在不进行所有关联的情况下使用实体? 目前,我还没有找到另一种方法来创建继承带有关联的类的模
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
我在 grails 中有一个域类......我如何让 gorm 在创建数据库时忽略这个实体?就别管它了。 最佳答案 如果我理解,你不想从域类创建表?如果是,请在域类中使用此代码: static map
我正在努力解决这个问题:如何判断一个概念是聚合根还是只是一个实体(属于 AR 的一部分)? : 他们都有 ID 它们都是由实体或值对象组成 也许如果我需要引用其他 AR 中的实体,那么我需要将其设为
我已经尝试在 HTML 中包含以下代码,用于附加文件符号。但它显示一个空的白框。 📎 📎 📎 是否有替代的 HTML 附加文件符号实体? 如果没有,我们可以手动创建
如何在我的实体中以 14-04-2017 格式存储日期? 但我必须从字符串中解析它。 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-
我需要从两个连接表中获取数据。数据集是什么类型?我是否需要创建一个包含这两个表中的属性的类以用于数据集类型,或者我可以使用实体模式中的类型。我如何修改我的方法才能正常工作? public static
好的,我们正在尝试建立一个中央站点来查看来自销售我们产品的多个供应商的数据。这些多个供应商使用不同的销售系统(确切地说是两个不同的系统),因此每个数据库看起来完全不同。我们与他们的数据库同步,因此数据
我是 backbone 的新手。但是当我研究模型实体时,我不明白一些事情。如果我们可以像 java 或 C# 这样的标准语言一样定义模型属性,那就太好了。有没有可能是这样的。所以我的想法是这样的: M
我想获取存储在可绘制的 xml 文件中的形状的颜色。 我来到了将 Drawable 存储在 Drawable 变量中的步骤,所以,现在我想获取形状的颜色(纯色标签)。 有什么建议吗? 最佳答案 Gra
实体是直接映射到我们的数据库(我们用于 Hibernate)的类。 在调用 DAO 之前,我们的服务类包含这些实体的业务逻辑。 我们还有命令对象,它们是与特定 View 相关的 POJO。有人告诉我实
在我的应用程序中,我需要显示不同存储过程返回的记录列表。每个存储过程返回不同类型的记录(即列数和列类型不同)。 我最初的想法是为每种类型的记录创建一个类,并创建一个函数来执行相应的存储过程并返回 Li
我是一名优秀的程序员,十分优秀!