查询可以从非子节点获取数据的 XmlListModel

Query for XmlListModel which could get data from not child-nodes

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

ITEM 通过属性 type:

引用 ITEMTYPE
<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 具有相同的属性类型。

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

试试看:

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