为什么加载XML文件时,Qt会丢失我的细节空格Unicode字符?

5

我有一个XML文档,其中一部分包含以下内容:

<math display='block'><mtext>&#x2009;</mtext></math>

如果在Qt中载入该代码(特别是在我发现这个问题的Qt MathML小部件中),QDomDocument对象会丢失Unicode的细空格字符(U+2009)。以下Python示例代码演示了这个问题:

from PyQt4.QtXml import *

d = QDomDocument()
d.setContent("<math display='block'><mtext>&#x2009;</mtext></math>")
print repr(unicode(d.toString()))

这段代码的输出结果是:
u'<math display="block">\n <mtext/>\n</math>\n'

在细间距后插入额外的非空格字符可以防止细间距丢失。

这是我的错误,一个XML特性还是Qt有一个bug?

1个回答

5

来自QDomDocument的文档

仅由空格组成的文本节点将被剥离并不会出现在QDomDocument中。如果不希望出现这种行为,可以使用允许提供QXmlReader的setContent()重载。

因此,您不会丢失仅有空格的数据(示例为C ++):

QXmlSimpleReader reader;
QXmlInputSource source;
QDomDocument dom;

source.setData(QString("<mtext>&#x2009;</mtext>"));
dom.setContent(&source, &reader);

1
哼...除了   不是空格外,XML 规范指出只有“空格(#x20)字符、回车符、换行符或制表符”才是空白符。 规范还说:“可以将名为 xml:space 的特殊属性附加到元素上,以表明在该元素中,应用程序应保留空格。” 因此,如果 QT 将   视为空白符,@xioxix 可能会更简单地通知 XML 处理器: <math display='block'><mtext xml:space="preserve">&#x2009;</mtext></math> - Roger_S
2
好的,QDomDocument将那个细小空格字符处理为一个空格,而不是按照XML规范。并且QDomDocument似乎不支持xml:space属性。所以xioxox可以提交错误报告。在等待修复时,使用QXmlReader的setContent()方法可以解决问题。 - user362638
谢谢 - 我会接受这个解决方案,并提交一个错误报告! - xioxox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接