qdomdocument setcontent_xml解析中QDomDocument的setContent步骤报错

在使用Qt的QDomDocument解析XML文件时,遇到setContent方法报错:'error occurred while parsing element',错误位于第1行第1列。问题在于没有正确打开并关闭文件。解决方案是先打开文件,然后调用setContent方法,最后关闭文件。

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

xml解析中QDomDocument的setContent方法报错

接触Qt不久,今天要做一个结果列表,就采用了xml,然后就用Qt的DOM来解析,结果发现,每次执行到QDomDocument的setContent方法都要报错,贴代码:

xml文件:recordshistoryrecords.xml

XML code<?xml version="1.0" encoding="UTF-8" ?>

100

0.5

1200

0.6

good

110

0.6

1100

0.3

bad

解析xml文件的代码:

C/C++ codevoid historyrecords::showhisrecords() {

QDomDocument doc;

QFile file("recordshistoryrecords.xml");

QString errorStr;

int errorLine;

int errorCol;

//setContent是将指定的内容指定给QDomDocument解析,

//第一参数可以是QByteArray或者是文件名等

if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol))

{

//如果出错,则会进入这里。errorStr得到的是出错说明

//errorLine和errorCol则是出错的行和列

qDebug() << errorStr << "line: " << errorLine << "col: " << errorCol;

<
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
<html><head><meta http-equiv="Content-Type" content="text/html; charset= =iso-8859-1"> <title>Trioptics Certificate</title> <link type="text/css" rel="stylesheet" href="certificate.css"></link> <base href="file:///C:/Program%20Files%20(x86)/TRIOPTICS%20GmbH/MTF-LAB%2= 05/Certificates/"></base></head> <body id="IBodyCert" class="CBodyCert"> <!-- open certificate table --> <table align="left" id="ITableCert" class="CTableCert"> <!-- Header --> <tbody><tr id="ITRCompany" class="CTRHeader"> <td id="ITDCompany" class="CTDHeader"> <div id="IDivCompany" class="CDivHeader">ImageMaster - Certificate</div> </td> <td id="ITDLogo" class="CTDHeader"> <img src="./img/Trioptics-Logo-250x65.png" id="ITDLogo" class="CTDHea= der"> </td> </tr> <tr id="ITDSlogan" class="CTRHeader"> <td colspan="2" id="ITDSlogan" class="CTDHeader"> </td> </tr> <tr> <td colspan="2"> <pre>Company : ****** Operator : ****** Time/Date : 13:30:33 June 12, 2025 Sample ID : ****** Measure Program : MTF vs. Field Temperature : 20°C Measured with : <a href="http://www.trioptics.com/">TRIOPTICS</a> - MT= F-LAB - Vers. 5.16.1 Instrument S/N : 09-113-0519 Comments : SN215U0540 </pre> </td> </tr> <tr> <td colspan="2"> </td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Parameter: MTF vs. Image Height</b> <pre>Setup Type : Object Infinite / Image Finite EFL (Collimator): 50 mm Wavelength : 940 nm (NIR) EFL (Sample) : 1.5550 mm F-Number : 2.0000 Object Angle : -0.0198 ° Focus Position : 85.8471 Sample Azimuth : 0.0 ° </pre></td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Graph: MTF vs. Image Height</b> <br><br> <right> <img src="Chart12.png"> </right> </td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Table: MTF vs. Image Height</b> <br><br> <!-- open measurement table --> <table cellspacing="0" align="left" id="ITableDataItems" class="CTa= bleDataItems"> <!-- begin table caption --> <tbody><tr id="ITRDataCaption" class="CTRDataCaption"> <td id="ITDCaptionBlank" class="CTDCaptionBlank"></td> <td align="center" colspan="5" id="ITDDataCaption" class="CTDDataCa= ption">Image Height (mm)</td> </tr> <tr id="ITRDataCaption" class="CTRDataCaption"> <td id="ITDDataCaption" class="CTDDataCaption">MTF</td> <td id="ITDDataCaption" class="CTDDataCaption">0.42800</td> <td id="ITDDataCaption" class="CTDDataCaption">0.29960</td> <td id="ITDDataCaption" class="CTDDataCaption">-0.00114</td> <td id="ITDDataCaption" class="CTDDataCaption">-0.29960</td> <td id="ITDDataCaption" class="CTDDataCaption">-0.42800</td> <td id="ITDDataCaption" class="CTDDataCaption">Legend</td> </tr> <!-- end table caption --> <!-- begin measurement data --> <tr id="ITRDataItem" class="CTRDataItem"> <td id="ITDEven" class="CTDDataItem">Tan 100(lp/mm)</td> <td id="ITDEven" class="CTDDataItem">0.599</td> <td id="ITDEven" class="CTDDataItem">0.677</td> <td id="ITDEven" class="CTDDataItem">0.668</td> <td id="ITDEven" class="CTDDataItem">0.703</td> <td id="ITDEven" class="CTDDataItem">0.645</td> <td colspan="1" id="ITDLegend" class="CTDLegend"><font color="ff000= 0">— — —</font></td> </tr> <tr id="ITRDataItem" class="CTRDataItem"> <td id="ITDEven" class="CTDDataItem">Sag 100(lp/mm)</td> <td id="ITDEven" class="CTDDataItem">0.558</td> <td id="ITDEven" class="CTDDataItem">0.659</td> <td id="ITDEven" class="CTDDataItem">0.673</td> <td id="ITDEven" class="CTDDataItem">0.688</td> <td id="ITDEven" class="CTDDataItem">0.642</td> <td colspan="1" id="ITDLegend" class="CTDLegend"><font color="ff000= 0">————</font></td> </tr> <!-- end measurement data --> <!-- close measurement table --> </tbody></table><br clear="all"> </td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Parameter: MTF vs. Object Angle</b> <pre>Setup Type : Object Infinite / Image Finite EFL (Collimator): 50 mm Wavelength : 940 nm (NIR) EFL (Sample) : 1.5550 mm F-Number : 2.0000 Object Angle : -0.0198 ° Focus Position : 85.8471 Sample Azimuth : 0.0 ° </pre></td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Graph: MTF vs. Object Angle</b> <br><br> <right> <img src="Chart11.png"> </right> </td> </tr> <tr> <td colspan="2"> <hr> <b>Measurement Table: MTF vs. Object Angle</b> <br><br> <!-- open measurement table --> <table cellspacing="0" align="left" id="ITableDataItems" class="CTa= bleDataItems"> <!-- begin table caption --> <tbody><tr id="ITRDataCaption" class="CTRDataCaption"> <td id="ITDCaptionBlank" class="CTDCaptionBlank"></td> <td align="center" colspan="5" id="ITDDataCaption" class="CTDDataCa= ption">Object Angle (?</td> </tr> <tr id="ITRDataCaption" class="CTRDataCaption"> <td id="ITDDataCaption" class="CTDDataCaption">MTF</td> <td id="ITDDataCaption" class="CTDDataCaption">-15.33590</td> <td id="ITDDataCaption" class="CTDDataCaption">-10.72937</td> <td id="ITDDataCaption" class="CTDDataCaption">0.00072</td> <td id="ITDDataCaption" class="CTDDataCaption">10.77662</td> <td id="ITDDataCaption" class="CTDDataCaption">15.40352</td> <td id="ITDDataCaption" class="CTDDataCaption">Legend</td> </tr> <!-- end table caption --> <!-- begin measurement data --> <tr id="ITRDataItem" class="CTRDataItem"> <td id="ITDEven" class="CTDDataItem">Tan 100(lp/mm)</td> <td id="ITDEven" class="CTDDataItem">0.599</td> <td id="ITDEven" class="CTDDataItem">0.677</td> <td id="ITDEven" class="CTDDataItem">0.668</td> <td id="ITDEven" class="CTDDataItem">0.703</td> <td id="ITDEven" class="CTDDataItem">0.645</td> <td colspan="1" id="ITDLegend" class="CTDLegend"><font color="ff000= 0">— — —</font></td> </tr> <tr id="ITRDataItem" class="CTRDataItem"> <td id="ITDEven" class="CTDDataItem">Sag 100(lp/mm)</td> <td id="ITDEven" class="CTDDataItem">0.558</td> <td id="ITDEven" class="CTDDataItem">0.659</td> <td id="ITDEven" class="CTDDataItem">0.673</td> <td id="ITDEven" class="CTDDataItem">0.688</td> <td id="ITDEven" class="CTDDataItem">0.642</td> <td colspan="1" id="ITDLegend" class="CTDLegend"><font color="ff000= 0">————</font></td> </tr> <!-- end measurement data --> <!-- close measurement table --> </tbody></table><br clear="all"> </td> </tr> <!-- close certificate table --> </tbody></table> </body></html> 为啥这个内容调用QDomDocumentsetContent会失败
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值