【问题标题】:Accessing xml attributes from a child node从子节点访问 xml 属性
【发布时间】:2011-03-31 10:03:46
【问题描述】:

在我的 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";

我可以得到所有的瓷砖 gids。我的问题是我想仅检索碰撞层的平铺 gid。

一些伪:

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

我该怎么做?

我尝试使用currentNode-&gt;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"; 什么都没找到?

【问题讨论】:

    标签: xml xpath libxml2


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

    • " " 有问题,因为正则表达式必须在 " 像这样 "/layer[@name="Collisions"]/data/title/@gid"
    • 是的,您必须像这样转义双引号:xmlChar *xpath = (xmlChar*) "/layer[@name=\"Collisions\"]/data/title/@gid";(尽管这取决于您使用的编程语言,我假设它是 C)。
    • 是的,它的 C。谢谢,我认为转义会影响表达式。以上似乎都不起作用。 :( 我不知道为什么,或者如何解决它。除非是因为我的其他代码。我会在 1 秒内用代码更新我的问题。谢谢
    • 不用担心。我通过在 /layer[@name="Collisions"]/data/title/@gid 的前面添加 / 解决了这个问题。我的 xml 源代码中有 Collsions 而不是 Collisions。 pff:/
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多