我需要使用以下類型的格式創建XML文檔。使用NSXMLElement在文本塊的中間添加標籤
<帕拉>
這是一些文本約<的someMethod >,你需要了解。
< /對>
我在與通用的XML代沒有任何問題,但是這一個方面給我一些問題。
感謝鄉親
斯科特
我需要使用以下類型的格式創建XML文檔。使用NSXMLElement在文本塊的中間添加標籤
<帕拉>
這是一些文本約<的someMethod >,你需要了解。
< /對>
我在與通用的XML代沒有任何問題,但是這一個方面給我一些問題。
感謝鄉親
斯科特
不知道爲什麼,我校沒有得到張貼...
這是關於<codeVoice>的someMethod </codeVoice >,你需要一些文本知道關於。
這就是我需要複製的。
如果<someMethod>
實際上是一個元素,那麼你需要創建一種NSXMLTextKind的NSXMLNode(通過initWithKind :),創建<someMethod>
節點,並創建另一個文本節點,那麼爲了兒童加入所有三到您的<Para>
節點。關鍵是創建兩個文本部分作爲單獨的節點。
重讀這個問題之後,我想可能<someMethod>
並不打算成爲一個節點,而應該是文本?如果是這樣,這只是一個逃避問題(< | >)
,但我猜測這並不是那麼簡單,考慮到你是誰。 :)
一種方法是製作para
節點的stringValue的可變副本,然後在「someMethod」文本週圍插入標籤。使用-[NSXMLNode initWithXMLString:error:]
創建一個新的NSXMLNode,並用新的NSXMLNode替換舊的NSXMLNode。這可能更短,但它需要一些字符串操作。
如果您知道para
節點是單獨運行的文本,那麼您可以在我剛寫入的NSXMLNode上使用此類別,這似乎比我描述的更加冗長。取決於你的需求是什麼以及你喜歡用NSMutableStrings搞亂多少。 :)
@implementation NSXMLElement (ElementSplitting)
- (void)splitTextAtRangeInStringValue:(NSRange)newNodeRange withElement:(NSString *)element {
/* This is pretty simplistic; it assumes that you're attempting to split an element node (the receiver) with a single stringValue. If you need to do anything more complicated, you'll have to do some more work. For this limited example, we need three new nodes(!):
1. One new text node for the first part of the original string
2. One new element node with a stringValue of the annotated part of the string
3. One new text node for the tail part of the original string
An alternate approach is to use -[NSXMLNode initWithXMLString:error:] after making a mutable copy of the string and modifying that string with the new markup you want.
*/
NSXMLNode *prefaceTextNode = [[NSXMLNode alloc] initWithKind:NSXMLTextKind];
NSXMLElement *elementNode = [[NSXMLNode alloc] initWithKind:NSXMLElementKind];
NSXMLNode *suffixTextNode = [[NSXMLNode alloc] initWithKind:NSXMLTextKind];
NSString *fullStringValue = [self stringValue];
NSString *prefaceString = [fullStringValue substringToIndex:newNodeRange.location];
NSString *newElementString = [fullStringValue substringWithRange:newNodeRange];
NSString *suffixString = [fullStringValue substringFromIndex:newNodeRange.location + newNodeRange.length];
[prefaceTextNode setStringValue:prefaceString];
[elementNode setName:element];
[elementNode setStringValue:newElementString];
[suffixTextNode setStringValue:suffixString];
NSArray *newChildren = [[NSArray alloc] initWithObjects:prefaceTextNode, elementNode, suffixTextNode, nil];
for (id item in newChildren) { [item release]; } // The array owns these now.
[self setChildren:newChildren];
[newChildren release];
}
@end
...這裏是一個小例子:
NSString *xml_string = @"<para>This is some text about something.</para>";
NSError *xml_error = nil;
NSXMLDocument *doc = [[NSXMLDocument alloc] initWithXMLString:xml_string options:NSXMLNodeOptionsNone error:&xml_error];
NSXMLElement *node = [[doc children] objectAtIndex:0];
NSString *childString = [node stringValue];
NSRange splitRange = [childString rangeOfString:@"text about"];
[node splitTextAtRangeInStringValue:splitRange withElement:@"codeVoice"];
我不值得。 :) – pixel 2010-09-05 05:26:37
哇,謝謝克里斯和像素。
是的,最初我錯誤地使用了括號而不是someMethod的codeVoice標籤。
但現在一切都很好。我正在產生我需要感謝你們。
我會建議在xml文檔的相同結構中創建一個字典,然後將其寫入文件。 (雖然我不知道你在做什麼) – 2010-09-05 03:36:53