- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我使用 Apple 的 NSXMLParser 类来加载数据。我有一个单独的框架来序列化我的数据。
我已经受够了长破折号、Word 引号等出现在我的 XML 输出中并在解析时导致错误,这通常会由于解析器对这些字符的处理不当而导致数据丢失。
如果我将用户输入作为 NSString 对象,我想将其转换为 Base64(我有一个实用方法),然后将这些字节写入 XML 文件,以代替 NSString。我知道这可能会占用更多空间,但至少我不必再处理验证问题。
我的问题是,如何将 NSData 字节(在 NSLog 语句中看起来像 <8d72...>
)转换为 NSString,不使用编码取回原始值。我希望将那些出现在日志语句中的实际字节转换为 NSString。最后(加载这个序列化数据时),如果你有一个 NSString:
NSString *loadedData = @"8d72...";
如何从这种形式转变为人类可读的格式?整个编码过程对我来说有点难以理解,但我认为这是确保奇怪的用户输入正确保存在我的 XML 文件中的可靠方法。
最佳答案
明白了。我正在使用此答案中的编码/解码方法将我的 NSString 对象转换为 NSData 对象,反之亦然: Any base64 library on iphone-sdk?
然后我编写了这些利用上述方法的快速方法,并允许我将 Base64 字符串数据写入 XML。加载起来效果很好,已经用汉字、Word字符等进行了测试。如果你愿意,你也可以把它们解析出来,但至少错误不在解析器中。 (错误处理不当很容易导致数据丢失。)
+ (NSString *)toBase64String:(NSString *)string {
NSData *data = [string dataUsingEncoding: NSUnicodeStringEncoding];
NSString *ret = [NSStringUtil base64StringFromData:data length:[data length]];
return ret;
}
+ (NSString *)fromBase64String:(NSString *)string {
NSData *base64Data = [NSStringUtil base64DataFromString:string];
NSString* decryptedStr = [[NSString alloc] initWithData:base64Data encoding:NSUnicodeStringEncoding];
return [decryptedStr autorelease];
}
编辑: 由于原始链接已关闭,我找到了我刚才的代码,这是我上面提到的 NSStringUtil
方法。请注意,我没有编写此代码,但它多年来一直运行良好:
+ (NSData *)base64DataFromString: (NSString *)string {
unsigned long ixtext, lentext;
unsigned char ch, input[4], output[3];
short i, ixinput;
Boolean flignore, flendtext = false;
const char *temporary;
NSMutableData *result;
if (!string) {
return [NSData data];
}
ixtext = 0;
temporary = [string UTF8String];
lentext = [string length];
result = [NSMutableData dataWithCapacity: lentext];
ixinput = 0;
while (true) {
if (ixtext >= lentext) {
break;
}
ch = temporary[ixtext++];
flignore = false;
if ((ch >= 'A') && (ch <= 'Z')) {
ch = ch - 'A';
} else if ((ch >= 'a') && (ch <= 'z')) {
ch = ch - 'a' + 26;
} else if ((ch >= '0') && (ch <= '9')) {
ch = ch - '0' + 52;
} else if (ch == '+') {
ch = 62;
} else if (ch == '=') {
flendtext = true;
} else if (ch == '/') {
ch = 63;
} else {
flignore = true;
}
if (!flignore) {
short ctcharsinput = 3;
Boolean flbreak = false;
if (flendtext) {
if (ixinput == 0) {
break;
}
if ((ixinput == 1) || (ixinput == 2)) {
ctcharsinput = 1;
} else {
ctcharsinput = 2;
}
ixinput = 3;
flbreak = true;
}
input[ixinput++] = ch;
if (ixinput == 4) {
ixinput = 0;
unsigned char0 = input[0];
unsigned char1 = input[1];
unsigned char2 = input[2];
unsigned char3 = input[3];
output[0] = (char0 << 2) | ((char1 & 0x30) >> 4);
output[1] = ((char1 & 0x0F) << 4) | ((char2 & 0x3C) >> 2);
output[2] = ((char2 & 0x03) << 6) | (char3 & 0x3F);
for (i = 0; i < ctcharsinput; i++) {
[result appendBytes: &output[i] length: 1];
}
}
if (flbreak) {
break;
}
}
}
return result;
}
+ (NSString *)base64StringFromData: (NSData *)data length: (NSUInteger)length {
unsigned long ixtext, lentext;
long ctremaining;
unsigned char input[3], output[4];
short i, charsonline = 0, ctcopy;
const unsigned char *raw;
NSMutableString *result;
lentext = [data length];
if (lentext < 1) {
return @"";
}
result = [NSMutableString stringWithCapacity: lentext];
raw = [data bytes];
ixtext = 0;
while (true) {
ctremaining = lentext - ixtext;
if (ctremaining <= 0) {
break;
}
for (i = 0; i < 3; i++) {
unsigned long ix = ixtext + i;
if (ix < lentext) {
input[i] = raw[ix];
} else {
input[i] = 0;
}
}
output[0] = (input[0] & 0xFC) >> 2;
output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
output[3] = input[2] & 0x3F;
ctcopy = 4;
switch (ctremaining) {
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}
for (i = 0; i < ctcopy; i++) {
[result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];
}
for (i = ctcopy; i < 4; i++) {
[result appendString: @"="];
}
ixtext += 3;
charsonline += 4;
if ((ixtext % 90) == 0) {
[result appendString: @"\n"];
}
if (length > 0) {
if (charsonline >= length) {
charsonline = 0;
[result appendString: @"\n"];
}
}
}
return result;
}
关于objective-c - 将 NSString 转换为 Base64 数据以进行 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838263/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!