2017-01-20 1 views
1

В приведенном ниже файле XML есть ITEMS и ITEMTYPES. ITEMTYPES описывают элементы данного типа, ITEMS являются экземплярами этих типов. Отношения ITEM к ITEMTYPE является n:1Запрос для XmlListModel, который мог получить данные из не дочерних узлов

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()" } 
} 

, который, конечно, не работает. Я не знаю, как ссылаться на братьев и сестер, и как ссылаться на соответствующий узел, где оба типа ITEM и ITEMTYPE имеют одинаковый тип атрибута.

ответ

3

Чтобы присоединиться к узлам, вы можете использовать условия, то есть predicates.

Попробуйте это:

XmlListModel { 
    source: "..." 
    query: "//ITEMTYPES/ITEMTYPE[@type =//ITEMS/ITEM/@type]" 
    XmlRole { name: "col"; query: "Color/string()" } 
    XmlRole { name: "size"; query: "Size/string()" } 
} 
Смежные вопросы