QDomDocument - 如何从QString创建?

时间:2015-03-22 14:41:55

标签: c++ xml qt

如何从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版本和编码。 我想象一个正确的决定:

  1. 我需要创建QDomDocument rhythmdb;

  2. 为rhythmdb

  3. 指定XML版本和编码
  4. 创建像QDomElement childElement= rhythmdb.createElement("breakfast_menu");

  5. 这样的子元素
  6. 附加XML元素的breakfast_menu内容,例如childElement.setContent(res);

  7. setContent对象没有QDomElement方法。

    我如何以这种方式编程?

    感谢。

1 个答案:

答案 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标准。 ; - )