2010-09-05 62 views
2

我需要使用以下類型的格式創建XML文檔。使用NSXMLElement在文本塊的中間添加標籤

<帕拉>

這是一些文本約<的someMethod >,你需要了解。

< /對>

我在與通用的XML代沒有任何問題,但是這一個方面給我一些問題。

感謝鄉親

斯科特

+0

我會建議在xml文檔的相同結構中創建一個字典,然後將其寫入文件。 (雖然我不知道你在做什麼) – 2010-09-05 03:36:53

回答

0

不知道爲什麼,我校沒有得到張貼...

這是關於<codeVoice>的someMethod </codeVoice >,你需要一些文本知道關於。

這就是我需要複製的。

1

如果<someMethod>實際上是一個元素,那麼你需要創建一種NSXMLTextKind的NSXMLNode(通過initWithKind :),創建<someMethod>節點,並創建另一個文本節點,那麼爲了兒童加入所有三到您的<Para>節點。關鍵是創建兩個文本部分作爲單獨的節點。

重讀這個問題之後,我想可能<someMethod>並不打算成爲一個節點,而應該是文本?如果是這樣,這只是一個逃避問題(&lt; | &gt;),但我猜測這並不是那麼簡單,考慮到你是誰。 :)

3

一種方法是製作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"]; 
+0

我不值得。 :) – pixel 2010-09-05 05:26:37

1

哇,謝謝克里斯和像素。

是的,最初我錯誤地使用了括號而不是someMethod的codeVoice標籤。

但現在一切都很好。我正在產生我需要感謝你們。