查询XmlListModel,它可以从非子节点

时间:2017-01-20 10:01:19

标签: qml qt5 qtquick2

在下面的XML文件中,有ITEMSITEMTYPESITEMTYPES描述给定类型的项目,ITEMS是这些类型的实例。 ITEMITEMTYPE的关系为n:1

ITEM通过属性ITEMTYPE引用type

<ROOT>
  <ITEMS>
    <ITEM type="Z"/>
    <ITEM type="X"/>
    <ITEM type="Y"/>
    <ITEM type="X"/>
    <ITEM type="Y"/>
    <ITEM type="Z"/>
  </ITEMS>

  <ITEMTYPES>
    <ITEMTYPE type="X">
       <Color>Red</Color>
       <Size>100</Size>
    </ITEMTYPE>

    <ITEMTYPE type="Y">
       <Color>Green</Color>
       <Size>200</Size>
    </ITEMTYPE>

    <ITEMTYPE type="Z">
       <Color>Yellow</Color>
       <Size>150</Size>
    </ITEMTYPE>

  </ITEMTYPES>
</ROOT>

如何为XMLListModel创建查询,该查询为每个ITEM提供相应ITEMTYPE中定义的信息?

我天真的尝试是:

XmlListModel {
    id: xmlModel
    source: "test.xml"
    query: "/ROOT/ITEMS/ITEM"

    XmlRole { name: "type"; query: "@type/string()" }
    XmlRole { name: "size"; query: "../../ITEMTYPES/Size/string()" }
}

当然不起作用。我既不知道如何引用兄弟,也不知道如何引用相应的节点,ITEMITEMTYPE具有相同的属性类型。

1 个答案:

答案 0 :(得分:3)

您可以使用条件predicates加入节点。

试试:

XmlListModel {
    source: "..."
    query: "//ITEMTYPES/ITEMTYPE[@type =//ITEMS/ITEM/@type]"
    XmlRole { name: "col"; query: "Color/string()" }
    XmlRole { name: "size"; query: "Size/string()" }
}