【问题标题】:XCODE NSXML changing the element valueXCODE NSXML 改变元素值
【发布时间】:2013-06-20 00:25:54
【问题描述】:

我有一个名为 options.xml 的非常简单的 xml 文件

<Dat>
    <Name>Tom</Name>
    <Option>1</Option>
</Dat>

我正在尝试使用 NSXML 将“Tom”更改为“Jim”并保存文件。我怎样才能做到这一点。我阅读了许多文档,但没有直接的解决方案。有人可以帮我写代码吗?

更新:我最终尝试使用 Gdatasxml

 -(void)saveToXML
{
NSString* path = [[NSBundle mainBundle] pathForResource:@"options" ofType:@"xml"];

NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:path];
NSError *error;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];

GDataXMLElement *rootElement = [GDataXMLElement elementWithName:@"Dat"];

NSArray *mySettings = [doc.rootElement elementsForName:@"Dat"];

for (GDataXMLElement *mySet in mySettings)
{
    NSString *name;
    NSArray *names = [mySet elementsForName:@"Name"];
    if (names.count > 0)
    {
        GDataXMLElement *childElement = (GDataXMLElement *) [names objectAtIndex:0];
        name = childElement.stringValue;
        NSLog(childElement.stringValue);
        [childElement setStringValue:@"Jim"];
    } 
}

[xmlData writeToFile:path atomically:YES];


}

但这不是保存数据。帮助。

【问题讨论】:

  • Putz1103 是对的,您确实想将其解析为某种结构,更改值,然后将 XML 写回。如果你想作弊,你可以把它加载到NSString,然后做一个简单的newString = [oldString stringByReplacingOccurrencesOfString:@"&lt;Name&gt;Tom&lt;/Name&gt;" withString:@"&lt;Name&gt;Jim&lt;/Name&gt;"];。如果您需要更复杂的字符串搜索和替换,您可以使用NSRegularExpressionNSScanner。但稳健的解决方案(例如,如果您有 CDATA 元素,上述方法可能不起作用)是解析 XML,更新您的模型,然后将其写回。
  • 您是否注意到您的代码读入一个文件,使用该文件初始化一个新对象,以您想要的方式操作新对象,然后将原始文件数据写回一个新文件?跨度>

标签: iphone ios xml nsxml


【解决方案1】:

在 iOS 中编辑 XML 有点困难。您需要将原始 xml 解析为模型,然后形成 xml。

您可以利用 GDataXML 等第三方库从数据源生成 XML。

//Edited user info saved in a dictionary
NSDictionary *dictionary = @{@"Name": @"Jim", @"Option":@"1"};

GDataXMLElement *rootElement = [GDataXMLElement elementWithName:@"Dat"];
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    GDataXMLElement *element = [GDataXMLElement elementWithName:key stringValue:obj];
    [rootElement addChild:element];
}];
//xml document is formed
GDataXMLDocument *document = [[GDataXMLDocument alloc]
                              initWithRootElement:rootElement];
NSData *xmlData = document.XMLData;

NSString *filePath = [self savedXMLPath];
//XML Data is written back to a filePath
[xmlData writeToFile:filePath atomically:YES];

【讨论】:

【解决方案2】:

创建一个本质上是 XML“节点”的类。然后在您的解析器中以与您读取它们相同的方式设置这些 XML 节点的系统。然后搜索该正文并找到您想要更改的元素。更改。然后编写一个遍历这些“节点”对象的函数,并以 XML 格式写入一个新的 NSString 并将该字符串保存到文件中。据我所知,没有真正简单的方法可以编写 XML 文件。我敢肯定有人有一个库可以做到这一点,但我有非常复杂的 XML 需要处理,所以我自己编写了。如果您想要特定代码,请告诉我,我可以尝试为您提供您可能需要的部分内容。

【讨论】:

    【解决方案3】:

    您可以使用 GDATAXML 更改 XML 节点 这是工作代码sn-p

    NSString *XMLString = @"<Dat><Name>Tom</Name><Option>1</Option></Dat>";
    NSError *error = nil;
    GDataXMLElement *newElement = [[GDataXMLElement alloc] initWithXMLString: XMLString error: &error];
    NSLog(@"New element: %@ error: %@", newElement, error);
    if(nil == error)
    {
        GDataXMLElement *childElement = [[newElement elementsForName: @"Name"] objectAtIndex: 0];
        [childElement setStringValue:@"Jim"];
    
        childElement = [[newElement elementsForName: @"Option"] objectAtIndex: 0];
    
        [childElement setStringValue:@"2"];
    
    }
    NSLog(@"New element now: %@", newElement);
    

    使用此代码sn-p检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多