Доступ к атрибутам xml из дочернего узла - PullRequest
1 голос
/ 31 марта 2011

В моем XML-файле у меня есть узел, который есть на каждом слое слоя, например:

<layer name="Tile Layer 1" width="30" height="30">
  <data>
   <tile gid="69"/>
   <tile gid="69"/>

и

<layer name="Collsions" width="30" height="30">
  <data>
   <tile gid="0"/>
   <tile gid="0"/>
   <tile gid="0"/>

Теперь, если я использую следующий оператор, используя xpath

xmlChar *xpath = (xmlChar*) "//tile/@gid";

Я могу получить все уровни плитки.Моя проблема в том, что я хотел бы получить жидкие плитки только для слоя столкновений.

Некоторое псевдо:

//get to layer node
if(name == collision)
{
   get tile gids for this node list only
}

Как мне это сделать?

Я пытался использоватьcurrentNode->xmlChildrenNode и он пошел по узлам, но по какой-то причине он возвратил "текст" в одной точке?Это из-за пробелов?

Я использую это в следующем коде (выражение изменилось на xmlChar *xpath = (xmlChar*) "/layer[@name=\"Collisions\"]/data/tile/@gid";

xmlChar *xpath = (xmlChar*) "/layer[@name=\"Collisions\"]/data/tile/@gid";//"//tile/@gid";
xmlNodeSetPtr nodeset;
xmlXPathObjectPtr result;
int i;
xmlChar *keyword;
int numCollisionTiles = 0;

result = getnodeset (doc, xpath);
if (result) 
{
    nodeset = result->nodesetval;
    for (i=0; i < nodeset->nodeNr; i++) 
    {
        keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);

        int id = atoi(keyword);
        int index = i;
        if(id == 111)
        {
            numCollisionTiles += 1;
            index -= 899;
            printf("tile id : %d for index: %d\n", id, index);
        }

        xmlFree(keyword);
    }
    xmlXPathFreeObject (result);
}
printf("number of collision tiles : %d\n", numCollisionTiles);

}

Этот код работает, когда я использую следующиеxmlChar *xpath = (xmlChar*) "//tile/@gid"

Может ли следующее

keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1); 

заставить xmlChar *xpath = (xmlChar*) "/layer[@name=\"Collisions\"]/data/tile/@gid"; ничего не найти?

1 Ответ

2 голосов
/ 31 марта 2011

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

/layer[@name="Collisions"]/data/title/@gid

или

//tile[../../@name="Collisions"]/@gid

...