⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xml_parser.cpp

📁 功能:首先
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                newNode = m_pDocRoot->appendChild(newNode);
        }
        else
        {       this->ChainTag.Empty();
                m_pDocRoot = newNode;
                m_plDomDocument->documentElement = m_pDocRoot;
        }

        // Update Current Node (cast operation)
        //
        CurrentNode = newNode;

        // Update information for this Node
        //
        this->Grab_Node_Informations(CurrentNode);

        return true;
}

bool XML_PARSER::_add_firstchild(MSXML::IXMLDOMNodePtr newNode)
{       // Create Reference Node for the Insertion
        //
        _variant_t NodeRef = (IUnknown *)CurrentNode->firstChild;

        // Attach the Node to the document
        //
        if(CurrentNode != NULL)
        {       if(Is_MSXML_Node(this->CurrentNode) != MSXML::NODE_ELEMENT) return false;
                this->ChainTag_Add( this->Get_CurrentTag() );
                newNode = CurrentNode->insertBefore(newNode,NodeRef);
        }
        else if(m_pDocRoot != NULL)
        {       if(Is_MSXML_Node(this->m_pDocRoot) != MSXML::NODE_ELEMENT) return false;
                this->ChainTag_Add( (CString)(const char*)m_pDocRoot->nodeName );
                newNode = m_pDocRoot->insertBefore(newNode,NodeRef);
        }
        else
        {       this->ChainTag.Empty();
                m_pDocRoot = newNode;
                m_plDomDocument->documentElement = m_pDocRoot;
        }

        // Update Current Node (cast operation)
        //
        CurrentNode = newNode;

        // Update information for this Node
        //
        this->Grab_Node_Informations(CurrentNode);

        return true;
}

bool XML_PARSER::_add_before(MSXML::IXMLDOMNodePtr newNode)
{ 
		if(this->Is_Root())
        {       lasterror = "XML_PARSER::_add_before()   : Can't add node at same level that the root node";
                return false;
        }

        // Create Reference Node for the Insertion
        //
        MSXML::IXMLDOMNodePtr pParent;
        this->CurrentNode->get_parentNode(&pParent);
        _variant_t NodeRef = (IUnknown *)CurrentNode;


        // Attach the Node to the document
        //
        if(CurrentNode != NULL)
                newNode = pParent->insertBefore(newNode,NodeRef);
        else if(m_pDocRoot != NULL)
                newNode = m_pDocRoot->insertBefore(newNode,NodeRef);
        else
        {       m_pDocRoot = newNode;
                m_plDomDocument->documentElement = m_pDocRoot;
        }

        // Update Current Node (cast operation)
        //
        CurrentNode = newNode;

        // Update information for this Node
        //
        this->Grab_Node_Informations(CurrentNode);

        return true;
}

bool XML_PARSER::_add_after(MSXML::IXMLDOMNodePtr newNode)
{       // If CurrentNode->NextSibling == NULL then must call Add_LastChildNode on Parent Node
        // Because we can't use InsertBefore on a NULL Reference ;o)
        //
        // We are sure that a Parent node exist because before we control that we aren't not on root node.
        //
        if(CurrentNode->nextSibling == NULL)
        {       // Get Parent Node
                //
                MSXML::IXMLDOMNodePtr pParent;
                this->CurrentNode->get_parentNode(&pParent);

                // Set Parent node as Current Node
                //
                this->CurrentNode = pParent;
                this->Grab_Node_Informations(pParent);

                // Add Node as Last Child Node
                //
                return (this->Add_LastChildNode(Name));
        }

        // Create Reference Node for the Insertion
        //
        MSXML::IXMLDOMNodePtr pParent;
        this->CurrentNode->get_parentNode(&pParent);
        _variant_t NodeRef = (IUnknown *)CurrentNode->nextSibling;


        // Attach the Node to the document
        //
        if(CurrentNode != NULL)
                newNode = pParent->insertBefore(newNode,NodeRef);
        else if(m_pDocRoot != NULL)
                newNode = m_pDocRoot->insertBefore(newNode,NodeRef);
        else
        {       m_pDocRoot = newNode;
                m_plDomDocument->documentElement = m_pDocRoot;
        }

        // Update Current Node (cast operation)
        //
        CurrentNode = newNode;

        // Update information for this Node
        //
        this->Grab_Node_Informations(CurrentNode);

        return true;
}

bool XML_PARSER::Add_LastChildCData(LPCTSTR data)
{
     // Nodes members
     //
     MSXML::IXMLDOMNodePtr newNode;

     CComVariant vType(MSXML::NODE_CDATA_SECTION);
     newNode = m_plDomDocument->createNode(vType,"","");

     // Attach the Node to the document
     //
     bool Result = this->_add_lastchild(newNode);
     this->Set_TextValue(data);
   
     return Result;
}

bool XML_PARSER::Add_FirstChildCData(LPCTSTR data)
{    // Nodes members
     //
     MSXML::IXMLDOMNodePtr newNode;

     // If no child then use Add_LastChildCData or CurrentElement node not set yet
     //
     if(this->CurrentNode != NULL)
     {  if( !this->CurrentNode->hasChildNodes() )
             return (this->Add_LastChildCData(data));
     }
     else
         return (this->Add_LastChildCData(data));

     // Create the NODE
     //
     CComVariant vType(MSXML::NODE_CDATA_SECTION);
     newNode = m_plDomDocument->createNode(vType,"","");
      

     bool Result = this->_add_firstchild(newNode);
     this->Set_TextValue(data);

     return Result;
}

bool XML_PARSER::Add_CDataBefore(LPCTSTR data)
{   // Nodes members
    // IXMLDOMElementPtr CurrentNode;        /* Global Member */
    //
    MSXML::IXMLDOMNodePtr newNode;

    // Can't use this function on the root node
    //
    if(this->Is_Root())
        return false;
        
    // Create the NODE
    //
    CComVariant vType(MSXML::NODE_CDATA_SECTION);
    newNode = m_plDomDocument->createNode(vType,"","");

    bool Result = this->_add_before(newNode);
    this->Set_TextValue(data);

    return Result;
}

bool XML_PARSER::Add_CDataAfter(LPCTSTR data)
{   // Nodes members
    //
    MSXML::IXMLDOMNodePtr newNode;

    // Can't use this function on the root node
    //
    if(this->Is_Root())
    {       lasterror = "XML_PARSER::Add_CDataAfter(LPCTSTR)   : Can't add node at same level that the root node";
            return false;
    }

    // Create the NODE
    //
    CComVariant vType(MSXML::NODE_CDATA_SECTION);
    newNode = m_plDomDocument->createNode(vType,"","");

    bool Result = this->_add_after(newNode);
    this->Set_TextValue(data);

    return Result;
}

bool XML_PARSER::Add_LastChildNode(LPCTSTR Name)
{
        // Nodes members
        //
        MSXML::IXMLDOMNodePtr newNode;

        // Create NODE TYPE
        //
        CComVariant vType(MSXML::NODE_ELEMENT);

        // Create the NODE
        //
        newNode = m_plDomDocument->createNode(vType,Name,"");

        // Attach the Node to the document
        //
        return this->_add_lastchild(newNode);
}

bool XML_PARSER::Add_NodeBefore(LPCTSTR Name)
{       // Nodes members
        // IXMLDOMElementPtr CurrentNode;        /* Global Member */
        //
        MSXML::IXMLDOMNodePtr newNode;

        // Can't use this function on the root node
        //
        if(this->Is_Root())
                return false;
        // Create NODE TYPE
        //
        CComVariant vType(MSXML::NODE_ELEMENT);

        // Create the NODE
        //
        newNode = m_plDomDocument->createNode(vType,Name,"");

        return this->_add_before(newNode);
}

bool XML_PARSER::Add_NodeAfter(LPCTSTR Name)
{       // Nodes members
        // IXMLDOMElementPtr CurrentNode;        /* Global Member */
        //
        MSXML::IXMLDOMNodePtr newNode;

        // Can't use this function on the root node
        //
        if(this->Is_Root())
        {       lasterror = "XML_PARSER::Add_NodeAfter(LPCTSTR)   : Can't add node at same level that the root node";
                return false;
        }

        // Create NODE TYPE
        //
        CComVariant vType(MSXML::NODE_ELEMENT);

        // Create the NODE
        //
        newNode = m_plDomDocument->createNode(vType,Name,"");

        return this->_add_after(newNode);
}

bool XML_PARSER::Add_FirstChildNode(LPCTSTR Name)
{       // Nodes members
        // IXMLDOMElementPtr CurrentNode;        /* Global Member */
        //
        MSXML::IXMLDOMNodePtr newNode;
        //IXMLDOMNodeListPtr ChildList;

        // If no child then use Add_LastChildNode or CurrentElement node not set yet
        //
        if(CurrentNode != NULL)
        { if( !this->CurrentNode->hasChildNodes() )
             return (this->Add_LastChildNode(Name));
        }
        else
          return (this->Add_LastChildNode(Name));

        // Create NODE TYPE
        //
        CComVariant vType(MSXML::NODE_ELEMENT);

        // Create the NODE
        //
        newNode = m_plDomDocument->createNode(vType,Name,"");

        return this->_add_firstchild(newNode);
}

bool XML_PARSER::Set_Attribute(LPCTSTR AttribName,LPCTSTR AttribValue)
{
        // Nodes members
        MSXML::IXMLDOMElementPtr CurrentElementNode = CurrentNode;

        // Create Attribute variable
        //
        CComVariant sAttribute(AttribValue);

        // Set the new attribute
        //
        if(CurrentNode != NULL)
        {
           CurrentElementNode->setAttribute( AttribName, sAttribute );
           CurrentNode = CurrentElementNode;
           this->Grab_Node_Informations(CurrentNode);
        }
        else
        {   m_pDocRoot->setAttribute( AttribName, sAttribute );
            this->Grab_Node_Informations(m_pDocRoot);
        }

        // Return
        //
        return true;
}

bool XML_PARSER::Remove_Attribute(LPCTSTR AttribName)
{
        if(CurrentNode == NULL)
        {       if(this->m_pDocRoot != NULL)
                        this->CurrentNode = this->m_pDocRoot;
                else
                {       lasterror = "XML_PARSER::Remove_Attribute(LPCTSTR)   : Can't remove attribute on a NULL Node";
                        return false;
                }
        }

        MSXML::IXMLDOMElementPtr CurrentElementNode = CurrentNode;
        CurrentElementNode->removeAttribute(AttribName);
        CurrentNode = CurrentElementNode;

        return true;
}

bool XML_PARSER::Set_TextValue(LPCTSTR TextValue)
{
        // Nodes members
        // IXMLDOMElementPtr CurrentNode;        /* Global Member */
        //
        MSXML::IXMLDOMNodePtr newNode;

        // Find if a CHILD TEXT NODE exist or not
        //
        if(CurrentNode == NULL)
        {       if(this->m_pDocRoot != NULL)
                        this->CurrentNode = this->m_pDocRoot;
                else
                {       lasterror = "XML_PARSER::Set_TextValue(LPCTSTR)   : Can't set a Text on a NULL Node";
                        return false;
                }
        }

        if(this->Is_MSXML_Node(this->CurrentNode) == MSXML::NODE_CDATA_SECTION)
        {
           CComVariant sValue(TextValue);
           this->CurrentNode->put_nodeValue(sValue);

           return true;
        }

        // Rq: a NODE_CDATA_SECTION can't have any childs
        //
        if(this->CurrentNode->hasChildNodes())
        {
                MSXML::IXMLDOMNodePtr pChild;
                for(pChild = this->CurrentNode->firstChild; pChild != NULL; pChild = pChild->nextSibling)
                {       // Find it's a NODE TEXT
                        //
                        if(this->Is_MSXML_Node(pChild) == MSXML::NODE_TEXT)
                        {  // A Text Node is found, Replace it now!!
                           //
                           CComVariant sValue(TextValue);
                           pChild->put_nodeValue(sValue);
   
                           return true;
                        }
                }
        }

        // No previous Text was defined before, we can add it.
        //
        if(this->Is_MSXML_Node(this->CurrentNode) == MSXML::NODE_ELEMENT)
        {   // Create NODE TEXT type
            //
            CComVariant vType(MSXML::NODE_TEXT);

            // Create the node
            //
            newNode = m_plDomDocument->createTextNode(TextValue);

           // Attach the Node to the document
           //
           newNode = CurrentNode->appendChild(newNode);
        }

        return true;
}

bool XML_PARSER::Save_XML_Document(LPCTSTR strFileName)
{       // Save the XML document
        //
        m_plDomDocument->save(strFileName);

        // Return
        //
        return true;
}

void XML_PARSER::Reset_XML_Document()
{
        // Init
        //
        this->Init_MSXML();
        m_plDomDocument->loadXML("");
        m_pDocRoot = m_plDomDocument->documentElement;
        CurrentNode = NULL;

        // Init our members
        //
        this->AttribNames.RemoveAll();
        this->AttribValues.RemoveAll();
        this->Tag.Empty();
        this->Name.Empty();
        this->ChainTag.Empty();
        this->TextField.Empty();
        attrib_index = -1;
}

void XML_PARSER::Go_to_Root()
{ 
  attrib_index = -1;
  this->CurrentNode = this->m_pDocRoot;
  this->ChainTag.Empty();
}

bool XML_PARSER::Go_to_Child()
{       // Child node
        //
        MSXML::IXMLDOMNodePtr pChild;

        if(Is_MSXML_Node(this->CurrentNode) != MSXML::NODE_ELEMENT)
                return false;

        pChild = CurrentNode->firstChild;
        if(pChild == NULL) return false;
                
        // Grab Information from Child node
        //
        attrib_index = -1;
        ChainTag_Add(this->Get_CurrentTag());
        this->Grab_Node_Informations(pChild);

        this->CurrentNode = pChild;
        return true;
}

bool XML_PARSER::Go_to_Parent()
{       // Parent node
        //
        MSXML::IXMLDOMNodePtr pParent = NULL;

        if(this->CurrentNode == this->m_pDocRoot)
                return false;

        this->CurrentNode->get_parentNode(&pParent);
        this->CurrentNode = pParent;

        attrib_index = -1;
        this->ChainTag_Remove(1);
        this->Grab_Node_Informations(this->CurrentNode);
        return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -