QT XML解析 setContent 报错处理

本文探讨了使用QT解析XML文件时遇到的问题及解决方案。详细分析了错误原因,并提供了有效的解决办法,包括正确的编辑器选择和文件打开模式设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT XML解析 setContent 报错处理

使用QT解析XML文件,if (!doc.setContent(&file, true, &errorStr, &errorLine, &errorColumn))老是出现error,
试过网上的绝对路径,相对路径,使用stream方式,等都不行。
无奈需要自己debug,测试发现使用Doc方式可以成功writeXML,尝试使用doc方式生产XML来读取,发现OK了。
所以和XML的格式有关。

总结一下中间的几点问题:
1.XML 不应该用记事本打开,格式不对,没有自动换行。
2.XML应该使用 UltraEdit或写字板来打开。
3.open的属性还是要设定好,否则会出现重复追加的问题

模式 值 描述
QIODevice::NotOpen 0x0000 不打开
QIODevice::ReadOnly 0x0001 只读方式
QIODevice::WriteOnly 0x0002 只写方式,如果文件不存在则会自动创建文件
QIODevice::ReadWrite ReadOnly | WriteOnly 读写方式
QIODevice::Append 0x0004 此模式表明所有数据写入到文件尾
QIODevice::Truncate 0x0008 打开文件之前,此文件被截断,原来文件的所有数据会丢失
QIODevice::Text 0x0010 读的时候,文件结束标志位会被转为’\n’;写的时候,文件结束标志位会被转为本地编码的结束为,例如win32的结束位’\r\n’
QIODevice::UnBuffered 0x0020 不缓存

QString TriopticsParser::preprocessTriopticsForXmlNew(const QString & html) { QString result; result.reserve(html.size() + 200); // 1. 始终添加XML声明 result.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); // 2. 统一处理字符集声明 QString normalized = html; QRegularExpression charsetRegex("charset\\s*=\\s*[\\\"']?\\w+-\\d+[\\\"']?"); normalized.replace(charsetRegex, "charset=\"ISO-8859-1\""); // 3. 合并自闭合标签处理 QRegularExpression selfClosingTags("<(meta|link|img|br|hr)([^>]*)>", QRegularExpression::CaseInsensitiveOption); normalized.replace(selfClosingTags, "<\\1\\2/>"); // 4. 全局URL转义 QRegularExpression urlAmpersandRegex("(&)(?=[^#\\s]*[;=])"); normalized.replace(urlAmpersandRegex, "&"); // 5. 标签规范化 QRegularExpression tagRegex("<(/?)(\\w+)([^>]*)>"); int pos = 0; QRegularExpressionMatchIterator it = tagRegex.globalMatch(normalized); while (it.hasNext()) { QRegularExpressionMatch match = it.next(); // 添加原始内容 if (match.capturedStart() > pos) { result.append(normalized.mid(pos, match.capturedStart() - pos)); } QString tag = match.captured(2).toLower(); QString attrs = match.captured(3); // 特殊处理无效闭合标签 if (tag == "link" && match.captured(1) == "/") continue; // 属性值引号规范化 attrs.replace(QRegularExpression("=\\s*([^\"'\\s>]+)(?=[\\s>])"), "=\"\\1\""); result.append("<" + match.captured(1) + tag + attrs + ">"); pos = match.capturedEnd(); } // 添加剩余内容 if (pos < normalized.size()) { result.append(normalized.mid(pos)); } // 6. 后处理清理 result.replace("°", "°"); // 温度符号修复 result.replace("</link>", ""); // 移除残余闭合标签 return result; } QDomDocument doc; if (!doc.setContent(htmlContent)) { qWarning() << "Failed to parse HTML content"; return -1; }setContent报错
08-03
QString TriopticsParser::preprocessTriopticsForXmlNew(const QString & html) { // 预编译正则表达式(静态变量确保只编译一次) static const QRegularExpression tagRegex( R"(<(\/?)(\w+)([^>]*?)(\/?)>)", QRegularExpression::CaseInsensitiveOption | QRegularExpression::DotMatchesEverythingOption ); static const QStringList selfClosingTags = { "img", "br", "meta", "link", "input", "hr", "col", "area", "base", "command", "embed" }; // 预分配结果字符串内存(额外200字符用于XML声明和格式调整) QString result; result.reserve(html.size() + 200); // 查找<html>位置(优化搜索性能) int htmlStart = html.indexOf(QRegularExpression("<html[^>]*>", QRegularExpression::CaseInsensitiveOption)); if (htmlStart == -1) htmlStart = 0; // 添加XML声明(如果尚未添加) if (!result.contains("<?xml")) { result.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); } // 单次遍历处理标签 int pos = htmlStart; const int htmlSize = html.size(); while (pos < htmlSize) { QRegularExpressionMatch match = tagRegex.match(html, pos); if (!match.hasMatch()) { // 添加剩余内容并退出 result.append(html.mid(pos)); break; } // 添加匹配前的内容 if (match.capturedStart() > pos) { result.append(html.mid(pos, match.capturedStart() - pos)); } // 提取标签组件 const QString slash = match.captured(1); // 结束标签的斜杠 QString tagName = match.captured(2).toLower(); // 标签名(小写) const QString attributes = match.captured(3); // 属性字符串 const QString selfClose = match.captured(4); // 自闭合斜杠 // 构建新标签 QString newTag = '<' % slash % tagName; // 添加属性(如果有) if (!attributes.isEmpty()) { newTag += ' ' % attributes.trimmed(); } // 处理自闭合标签 if (selfClosingTags.contains(tagName) || !selfClose.isEmpty()) { // 确保正确自闭合格式 newTag += "/>"; } else { // 常规标签闭合 newTag += '>'; } result.append(newTag); pos = match.capturedEnd(); } // 移除无效闭合标签(优化为单次操作) result.replace(QRegularExpression("</link>", QRegularExpression::CaseInsensitiveOption), ""); // 优化内存使用 result.squeeze(); return result; }为啥调用QDoment的setContent报错
最新发布
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值