编辑和保存XML

时间:2012-12-07 19:18:10

标签: xml cocoa

抱歉这个基本问题 - 我需要一些帮助。我能够获取XML文档并保存它。无法进行编辑工作。我想使用textField的内容更新“theme”标签,并在保存之前使用操作进行设置。我的编辑代码显然不起作用。

感谢您的帮助。

-Paul。

 <temp>
<theme>note</theme>
 </temp>

 ///////

 NSMutableArray* temps = [[NSMutableArray alloc] initWithCapacity:10];
 NSXMLDocument *xmlDoc;
 NSError *err=nil;

 NSString *file = [input1 stringValue];

 NSURL *furl = [NSURL fileURLWithPath:file];
if (!furl) {
   NSLog(@"Unable to create URL %@.", file);
   return;
}
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl options:     (NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) error:&err];
 if (xmlDoc == nil) {
  xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl options:NSXMLDocumentTidyXML  error:&err];
}


 NSXMLElement* root  = [xmlDoc rootElement];
 NSArray* objectElements = [root nodesForXPath:@"//temp" error:nil];
for(NSXMLElement* xmlElement in objectElements)
[temps addObject:[xmlElement stringValue]];


 NSXMLElement *themeElement = [NSXMLNode elementWithName:@"theme"];
[root addChild:themeElement];
 NSString * theTheme = [textField stringValue];
[themeElement setStringValue:theTheme];

1 个答案:

答案 0 :(得分:2)

以下是如何更改文件中的主题元素。基本上,当您对元素设置了StringSalue时,根元素会使用新值进行更新,因此xmlDoc也会更新,因为它已链接到根元素。所以你可以把它写到文件中。举个例子,这是我开始使用的xml文档......

<root>
    <temp>
        <theme>first theme</theme>
        <title>first title</title>
    </temp>
    <temp>
        <theme>second theme</theme>
        <title>second title</title>
    </temp>
</root>

在此代码中,我将“第一个主题”值更改为“已更改的主题”。另请注意,我的“nodesForXPath”代码直接获取主题元素。

// the xml file
NSString* file = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/a.xml"];
NSURL *furl = [NSURL fileURLWithPath:file];

// get the xml document
NSError* err = nil;
NSXMLDocument* xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl options:(NSXMLNodePreserveWhitespace | NSXMLNodePreserveCDATA) error:&err];
if (err) {
    NSLog(@"There was an error reading the xml document.");
    return 0;
}
NSXMLElement* root  = [xmlDoc rootElement];

// look for the <theme> tags
NSArray* themeElements = [root nodesForXPath:@"//theme" error:nil];

// change a specific theme tag value
for(NSXMLElement* themeElement in themeElements) {
    if ([[themeElement stringValue] isEqualToString:@"first theme"]) {
        [themeElement setStringValue:@"changed theme"];
    }
}

// write xmlDoc to file
NSData* xmlData = [xmlDoc XMLDataWithOptions:NSXMLNodePrettyPrint];
if (![xmlData writeToURL:furl atomically:YES]) {
    NSLog(@"Could not write document out...");
}

[xmlDoc release];