如何从QDomDocument
创建QString
,包含许多XML
个节点?
我知道一种方法 - setContent
方法。但这不是更好的方法 - 如果我需要从包含
XML
<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>Light Belgian waffles covered with strawberries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>Homestyle Breakfast</name>
<price>$6.95</price>
<description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
<calories>950</calories>
</food>
我需要传递给像
这样的setContent字符串 rhythmdb.setContent("<?xml version='1.0' encoding='UTF-8'?>"
" <breakfast_menu>"+res+"</breakfast_menu");
这不是一个好方法 - 从setContent指定xml版本和编码。 我想象一个正确的决定:
我需要创建QDomDocument rhythmdb;
为rhythmdb
XML
版本和编码
创建像QDomElement childElement= rhythmdb.createElement("breakfast_menu");
附加XML
元素的breakfast_menu
内容,例如childElement.setContent(res);
但setContent
对象没有QDomElement
方法。
我如何以这种方式编程?
感谢。
答案 0 :(得分:2)
调查文档,看起来你真的只能将QString转换为整个QDomDocument。您无法将其作为QDomNode加载到现有的。
但是,您可以 - 在QDomDocuments与QDomDocument::importNode()之间复制加载的节点。因此,对于混合来自不同源QStrings的材料,您可以在临时文档上setContent()
,然后将任何所需节点导入到目标文档中。导入后,将这些本地副本插入所需的位置。
在您的情况下,这不会帮助您以当前形式使用字符串。它是一系列没有单一根元素的兄弟姐妹。根据{{3}},QDomDocument仅从有效的XML中获取setContent()
:
每个XML文档只有一个根元素。它包含所有其他元素,因此是所有其他元素的唯一父元素。 ROOT元素也称为PARENT元素。
因此,如果setContent()
是您唯一的字符串到XML机制,则需要在加载前将其包装在单个父级中。用<breakfast_menu>
作为前缀并用</breakfast_menu>
附加它似乎很好,可以通过正确的ROOT将其整形。
但不要担心Wikipedia:
输入时的编码仅在从字节流加载时才相关。您正在从QString加载,其中已经完成解码...(正确或不正确)。到那时它是<?xml version='1.0' encoding='UTF-8'?>
,无论你怎么说,编码都没有效果。
如果您想在输出上使用XML声明,则必须在Qt中手动添加它。默认情况下,它不包括在内,必须使用Unicode code points明确指定。这部分是因为规范说它是可选的,部分是因为永远不会有另一个XML标准。 ; - )