Iphone 获取XML子元素--包括标记名

Iphone 获取XML子元素--包括标记名,iphone,objective-c,xml,nsxmlparser,Iphone,Objective C,Xml,Nsxmlparser,我试图在iPhone上使用NSXMLParser解析一些XML 当我检测到我想要的元素时,我希望在开始元素和结束元素之间保持原样 例如,假设: <A> <K> <C> <D>dddd</D> </C> <E> eeee </E> </K> <F> ffff </f> &l

我试图在iPhone上使用
NSXMLParser
解析一些XML

当我检测到我想要的元素时,我希望在开始元素和结束元素之间保持原样

例如,假设:

<A>
    <K>
        <C>
            <D>dddd</D>
        </C>
        <E> eeee </E>
    </K>
    <F> ffff </f>
</A>

提前谢谢

NSXmlParser使用起来相当糟糕。您尝试过使用for解析吗?然后可以使用查询XML,这是一种更简单、更标准的XML文档解析方法。

NSXmlParser使用起来相当糟糕。您尝试过使用for解析吗?然后,您可以使用查询XML,这是一种更简单、更标准的XML文档解析方法。

您可能可以使用columnNumber、lineNumber解析器的方法来获取元素开始的位置(即将它们存储为所查找元素的didStartElement中的column1、line1),然后在该元素结束时,在DiEndElement中,再次获取列2和行2,然后将原始XML中的文本从(行1,列1)剪切到(行2,列2)

很粗糙,但可能有用

编辑:要提取文本,可以执行以下操作:

__block int lineNumber = 0;
__block NSMutableString* result = [NSMutableString stringWithCapacity:100];

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) {

if(lineNumber == line1) {
    [result appendString:[line substringFromIndex:column1]];
}
if(lineNumber > line1 && lineNumber < line2) [result appendString:line];

if(lineNumber == line2) {
    [result appendString:[line substringToIndex:column2]];
}
lineNumber++;
if(lineNumber > line2) *stop = YES;

}];
\uuuu块int lineNumber=0;
__block NSMutableString*result=[NSMutableString stringWithCapacity:100];
[str enumerateLinesUsingBlock:^(NSString*行,布尔*停止){
如果(行号==line1){
[result appendString:[line substringFromIndex:column1]];
}
如果(lineNumber>line1&&lineNumber第2行)*停止=是;
}];

我不知道元素开始/结束时解析器的位置是在该元素的开始还是结束处-您可能需要自己跳过它,或者,如果位置在元素的结束处,检查column1/column2是否在该行之外(在这种情况下,只需不添加任何内容)。此外,如果您需要保留换行符,您需要自己添加它们(而不是appendString:str使用appendFormat:“%@\n”,str)

您可能可以使用columnNumber、lineNumber解析器的方法来获取元素开始的位置(即,将它们存储为您查找的元素的didStartElement中的column1、line1),然后,当该元素结束时,在diEndElement中,再次获取column2和line2,然后将原始XML中的文本从(line1,column1)剪切到(line2,column2)

很粗糙,但可能有用

编辑:要提取文本,可以执行以下操作:

__block int lineNumber = 0;
__block NSMutableString* result = [NSMutableString stringWithCapacity:100];

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) {

if(lineNumber == line1) {
    [result appendString:[line substringFromIndex:column1]];
}
if(lineNumber > line1 && lineNumber < line2) [result appendString:line];

if(lineNumber == line2) {
    [result appendString:[line substringToIndex:column2]];
}
lineNumber++;
if(lineNumber > line2) *stop = YES;

}];
\uuuu块int lineNumber=0;
__block NSMutableString*result=[NSMutableString stringWithCapacity:100];
[str enumerateLinesUsingBlock:^(NSString*行,布尔*停止){
如果(行号==line1){
[result appendString:[line substringFromIndex:column1]];
}
如果(lineNumber>line1&&lineNumber第2行)*停止=是;
}];

我不知道元素开始/结束时解析器的位置是在该元素的开始还是结束处-您可能需要自己跳过它,或者,如果位置在元素的结束处,检查column1/column2是否在该行之外(在这种情况下,只需不添加任何内容)。另外,如果您需要保留换行符,您需要自己添加它们(而不是appendString:str使用appendFormat:“%@\n”,str)

好的,我成功地获得了列和行号,您知道我可以使用哪种方法将子字符串从某一列和行提取到另一列和行吗?谢谢。你的代码就做到了。但是,解析器返回的列号和行号是否为正确的索引:(.这可能与解析器的输入是数据有关,而上面的代码使用字符串。是的,因为列编号指的是嵌套级别,而不是文本中的实际行,对不起,我的错误。如果行号也不正确,那么我猜您可能必须按照其他人的建议尝试其他解析器……或者如果您只需要获取两个标记之间的文本,那么也许您根本不需要XML解析器,只需进行正则表达式匹配即可?谢谢您,好先生。我太狭隘了,没有意识到正则表达式就是我所需要的全部。正则表达式似乎是最简单的库之一(iOS似乎无法单独处理正则表达式)。不客气。顺便说一句,iOS中实际上支持正则表达式-请查看NSRegularExpression(尽管它仅在iOS 4.0之后才可用,因此如果您需要支持早期版本,则可以使用第三方组件).好的,我成功地获得了列号和行号,你知道我可以使用哪种方法将子字符串从某一列和行提取到另一列和行吗?谢谢。你的代码可以做到这一点。但是,解析器返回的列号和行号是否是正确的索引:(.这可能与解析器的输入是数据有关,而上面的代码使用字符串。是的,因为列编号指的是嵌套级别,而不是文本中的实际行,对不起,我的错误。如果行号也不正确,那么我猜您可能必须按照其他人的建议尝试其他解析器……或者如果您只需要获取两个标记之间的文本,那么也许您根本不需要XML解析器,只需进行正则表达式匹配即可?谢谢您,好先生。我太狭隘了,没有意识到正则表达式就是我所需要的全部。正则表达式似乎是最简单的库之一(iOS似乎无法单独处理正则表达式)。不客气。顺便说一句,iOS中实际上支持正则表达式-请查看NSRegularExpression(尽管它仅在iOS 4.0之后才可用,因此如果您需要支持早期版本,则可以使用第三方组件)。
__block int lineNumber = 0;
__block NSMutableString* result = [NSMutableString stringWithCapacity:100];

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) {

if(lineNumber == line1) {
    [result appendString:[line substringFromIndex:column1]];
}
if(lineNumber > line1 && lineNumber < line2) [result appendString:line];

if(lineNumber == line2) {
    [result appendString:[line substringToIndex:column2]];
}
lineNumber++;
if(lineNumber > line2) *stop = YES;

}];