QDomDocument的setContent方法报错

本文分享了一位初学者在使用QT进行XML文件编写时遇到的问题:调用setContent方法一直返回false。经过两小时的调试,作者发现创建元素时传入的tagName参数不能包含空格。

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

不知道是否有与我遇到同样的情况。初学QT,使用过QT写XML文件,发现使用调用setContent一直返回false。
调试了两个小时,最终发现是createElement传tagName参数的时候不能存在空格。


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
// 直接操作原始数据避免临时字符串 QString result; result.reserve(html.size() + 200); // 预分配内存 // 合并步骤:查找<html>位置并修复字符集 int htmlStart = html.indexOf("<html>", 0, Qt::CaseInsensitive); if (htmlStart == -1) htmlStart = 0; // 单次遍历处理多个任务 int pos = htmlStart; while (pos < html.size()) { // 处理标签 QRegularExpressionMatch tagMatch = tagRegex.match(html, pos); if (tagMatch.hasMatch()) { // 复制标签前的普通文本(兼容旧版Qt) int matchStart = tagMatch.capturedStart(); if (matchStart > pos) { result.append(html.mid(pos, matchStart - pos)); } // 获取标签组件(转换为小写) QString slash = tagMatch.captured(1).toLower(); QString tagName = tagMatch.captured(2).toLower(); QString attrs = tagMatch.captured(3).toLower(); // 特殊标签处理 if (tagName == "html" && !result.contains("<?xml")) { result.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); } // 构建新标签 result.append('<' % slash % tagName % attrs % '>'); pos = tagMatch.capturedEnd(); // 自闭合标签特殊处理 if (selfClosingRegex.match(tagMatch.captured(0)).hasMatch()) { result.replace(result.length() - 1, 1, "/>"); } } // 处理URL中的&符号(非标签区域) else { QRegularExpressionMatch ampMatch = urlAmpersandRegex.match(html, pos); if (ampMatch.hasMatch()) { int ampStart = ampMatch.capturedStart(); if (ampStart > pos) { result.append(html.mid(pos, ampStart - pos)); } result.append("href=\"" % ampMatch.captured(1) % "&" % ampMatch.captured(2) % "\""); pos = ampMatch.capturedEnd(); } else { // 没有匹配到,将剩余部分全部追加 result.append(html.mid(pos)); break; } } } // 后处理修复 result.replace("charset=\n=iso-8859-1", "charset=\"iso-8859-1\""); result.replace("</link>", ""); // 移除无效闭合标签 return result;只有这样setContent()不报错,但是while (pos < html.size())效率太低了
08-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值