使用C语言实现LibXml2中奇怪的树遍历行为

使用C语言实现LibXml2中奇怪的树遍历行为,c,xml,tree,libxml2,C,Xml,Tree,Libxml2,我有一个XML文件,其中的设备结构如下: <Device> <ID></ID> <VAL1></VAL1> <VAL2></VAL2> <VAL3></VAL3> <VAL4></VAL4> <VAL5></VAL5> <VAL6></VAL6> </Device>

我有一个XML文件,其中的设备结构如下:

<Device>
   <ID></ID>
   <VAL1></VAL1>
   <VAL2></VAL2>
   <VAL3></VAL3>
   <VAL4></VAL4>
   <VAL5></VAL5>
   <VAL6></VAL6>
</Device>

我的功能是查找第一个
元素,循环设备的子元素,并确保不存在意外的标记

注意:此函数使用XML_PARSE_NOBLANKS打开XML文件 选项,并且仅当curNode是XML_元素_节点时才检查它

//如果当前节点正在打开设备的设备标记
if(xmlStrcmp(curNode->name,(const xmlChar*)“Device”)==0)
{
//循环遍历子节点并确保它们匹配
//有效的标记,并且没有其他子标记元素
childNode=curNode->children;
while(childNode!=NULL)
{
if(childNode->type==XML\u元素\u节点)
{
对于(nIdx=0;nIdx<7;nIdx++)
{
如果(xmlStrcmp(childNode->name,
(const xmlChar*)acXmlChildTags[nIdx])==0)
{
bChildFound=TRUE;
打破
}
}
如果(bChildFound!=真)
{
nReturnValue=故障;
打破
}
}
childNode=xmlNextElementSibling(childNode);
}
}
acXmlChildTags
是一个
char*
数组,等于标记字符串(“ID”、“VAL1”等)

除了这里的整体逻辑中的任何问题之外,因为函数的部分被排除在外,我注意到的是我的函数正确地到达了“设备”内部的“VAL6”元素,但是当我转到下一个元素时,它会跳回到“VAL3”,然后继续返回到“VAL6”然后最后到达空的下一个元素以跳出循环

有人能向我解释为什么去“设备”最后一个子元素的下一个元素同级会把我推回第三个子元素吗


我为这个复杂的问题提前道歉。

为什么不直接使用
childNode=childNode->next?您是否已检查了
如果(类型)
其他部分?也许你运行了一个你没有预料到的路径。@PeterMiehle我开始使用
childNode->next
,这显示了相同的结果。
else
条件实际上从未达到,只是“以防万一”@PeterMihle它基本上就像我在
Device
下的子树一样,看起来是这样的:
ID->VAL1->VAL2->VAL3->VAL4->VAL6->VAL3->VAL4->VAL5->VAL6->NULL
也许我只需要重新考虑一下,使用XPath检查
Device
元素中的标记,而不是循环
// If current node is opening Device tag for a device
if (xmlStrcmp(curNode->name, (const xmlChar*)"Device") == 0)
{
   // Loop through child nodes and assure that they match
   // a valid tag and have no other children tag elements
   childNode = curNode->children;

   while (childNode != NULL)
   {
      if (childNode->type == XML_ELEMENT_NODE)
      {
         for (nIdx = 0; nIdx < 7; nIdx++)
         {
            if (xmlStrcmp(childNode->name, 
                         (const xmlChar*)acXmlChildTags[nIdx]) == 0)
            {
               bChildFound = TRUE;
               break;
            }
         }
         if (bChildFound != TRUE)
         {
            nReturnValue = FAILURE;
            break;
         }
      }
      childNode = xmlNextElementSibling(childNode);
   }
}