以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  求助。。关于同名节点的创建问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=25876)


--  作者:Splendour
--  发布时间:12/25/2005 8:01:00 PM

--  求助。。关于同名节点的创建问题
MSXML2::IXMLDOMNodePtr CXMLFile::FindNode(
    int nID,
    MSXML2::IXMLDOMNodePtr parentNode,
    std::string* pCStrKeys, int iNumKeys,
    bool bAddNodes /*= false*/)
{
 MSXML2::IXMLDOMNode* foundNode = NULL;
 MSXML2::IXMLDOMElementPtr tempElem = NULL;
    std::string sKey = "";

    MSXML2::IXMLDOMNodeListPtr lis = NULL;
   
 for (int i=0; i<iNumKeys; i++)
 {
        sKey = "//";
        sKey += pCStrKeys[i];
  // find the node named X directly under the parent
        lis = NULL;
        
        lis = parentNode->selectNodes(_bstr_t(sKey.c_str()));
        long lListLength = lis->Getlength();
        
        if(i < iNumKeys-1)
        {
           lis->get_item((lListLength - 1), &foundNode);
        }   
        else
        {
            lis->get_item(nID, &foundNode);
        }
        //foundNode = parentNode->selectSingleNode(_bstr_t(sKey.c_str()));
        


        
  if (foundNode == NULL )
  {
   // if its not found...
   if (bAddNodes)  // create the node and append to parent (Set only)
   {
                m_nLastID = nID;

    tempElem=XmlDocPtr->createElement(_bstr_t(pCStrKeys[i].c_str()));
    if (tempElem)
    {
                    
     foundNode=parentNode->appendChild(tempElem);

                    
     // since we are traversing the nodes, we need to set the parentNode to our foundNode
     parentNode = NULL;
     parentNode = foundNode;
     foundNode = NULL;
    }
   }
   else
   {
    foundNode = NULL;
    parentNode = NULL;
    break;
   }
  }
        else
  {
   parentNode = NULL;
   parentNode = foundNode;
   foundNode = NULL;
  }
 }

 return parentNode;
}
上面是同名节点的创建过程。其中pCStrKeys是以解析好节点名称
例如:/ROOT/BOOK/HISTORY  会被解析成ROOT、BOOK、HISTORY三个字符串存在pCStrKeys中。然后从根节点开始向下寻找目标节点。当中间节点有同名节点时会找到最后一个同名节点然后在他的下面添加新的节点。但是,我发现新的节点总是加在第一个中间同名节点上。
例如
下面是期望结果
<ROOT>
   <BOOK id = 1>
     <HISTORY value = 1987>
  <BOOK id = 2>
     <HISTORY value = 2005>
<ROOT>
但是运行后总是这样<ROOT>
   <BOOK id = 1>
     <HISTORY value = 2005>
  <BOOK id = 2>
<ROOT>请高手指点


--  作者:Splendour
--  发布时间:12/25/2005 8:51:00 PM

--  
求助,这已经困扰我好几宿了
--  作者:Splendour
--  发布时间:12/25/2005 8:54:00 PM

--  
 tempElem=XmlDocPtr->createElement(_bstr_t(pCStrKeys[i].c_str()));
    if (tempElem)
    {
                    
     foundNode=parentNode->appendChild(tempElem);

     // since we are traversing the nodes, we need to set the parentNode to our foundNode
     parentNode = NULL;
     parentNode = foundNode;
     foundNode = NULL;
    }
这好像有问题,我创建的子节点后发现指向的是与其相同的第一个同名节点,不知如何解决


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms