2

我需要创建一个具有以下格式类型的 XML 文档。

<段>

这是您需要了解的有关 <someMethod> 的一些文本。

</段>

我对一般的 XML 生成没有任何问题,但是这一方面给我带来了一些问题。

谢谢各位

斯科特

4

4 回答 4

3

一种方法是制作para节点的 stringValue 的可变副本,然后在“someMethod”文本周围插入标签。使用它创建一个新的 NSXMLNode,-[NSXMLNode initWithXMLString:error:]并用新的 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"];
于 2010-09-05T05:10:05.750 回答
1

哇,谢谢克里斯和像素。

是的,最初我只是在名称周围使用括号而不是在 someMethod 周围使用 codeVoice 标记是一个错误。

但现在一切都很好。感谢你们,我正在生成我需要的东西。

于 2010-09-05T05:45:01.007 回答
1

如果<someMethod>实际上是一个元素,那么您需要创建一个类型为 NSXMLTextKind 的 NSXMLNode(通过 initWithKind:),创建您的<someMethod>节点,并创建另一个文本节点,然后将所有三个按顺序添加为您的节点的子<Para>节点。关键是将两个文本部分创建为单独的节点。

重读问题后,我想也许<someMethod>不是打算成为节点,而应该是文本?如果是这样,这只是一个逃避问题(&lt; | &gt;),但考虑到您是谁,我猜这并不是那么简单。:)

于 2010-09-05T04:43:33.313 回答
0

不知道为什么我的更正没有发布...

这是您需要了解的有关 <codeVoice>someMethod</codeVoice> 的一些文本。

这就是我需要复制的。

于 2010-09-05T04:28:38.243 回答