赞助

C++ tinyXml直接解析XML字符串

转载:http://www.cnblogs.com/1024Planet/p/4401929.html

 

 

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<person>
    <name>Alan</name>
    <age>26</age>
    <height>165</height>
    <weight>65</weight>
    <introduction>C senior engineer</introduction>
</person>

解析代码

#include <stdio.h>
#include "tinyxml.h"

int tinyxmlTest(void);

int main(int argc, char* argv[])
{
    tinyxmlTest();
    return 1;
}

int tinyxmlTest(void)
{
#if (1)
    char* xmlStr = "\
<person>\
    <name>Alan</name>\
    <age>26</age>\
    <height>165</height>\
    <weight>65</weight>\
    <introduction>C senior engineer</introduction>\
</person>";
    
    TiXmlDocument* myDocument = new TiXmlDocument();
    myDocument->Parse(xmlStr);

#else
    TiXmlDocument* myDocument = new TiXmlDocument();
  myDocument->LoadFile("person.xml");
#endif
    //.....person.....
  TiXmlElement* rootElement = myDocument->RootElement();
    if (rootElement == NULL || strcmp(rootElement->Value(), "person"))
        return 0;
    printf("%s:\t%s\n", rootElement->Value(), rootElement->GetText());

    //.....name.....
  TiXmlElement* element = rootElement->FirstChildElement();
    if (element == NULL || strcmp(element->Value(), "name"))
        return 0;
    printf("%s:\t%s\n", element->Value(), element->GetText());

    //.....age.....
    element = element->NextSiblingElement();
    if (element == NULL || strcmp(element->Value(), "age"))
        return 0;
    printf("%s:\t%s\n", element->Value(), element->GetText());
    
    //.....height.....
    element = element->NextSiblingElement();
    if (element == NULL || strcmp(element->Value(), "height"))
        return 0;
    printf("%s:\t%s\n", element->Value(), element->GetText());

    //.....weight.....
    element = element->NextSiblingElement();
    if (element == NULL || strcmp(element->Value(), "weight"))
        return 0;
    printf("%s:\t%s\n", element->Value(), element->GetText());

    //.....introduction.....
    element = element->NextSiblingElement();
    if (element == NULL || strcmp(element->Value(), "introduction"))
        return 0;
    printf("%s:\t%s\n\n", element->Value(), element->GetText());

    return 1;
}

 

上面是网友贴的代码,我根据实际开发中遇到的问题,贴出自己的代码

第一种:

    char* xmlStr = "\<?xml version=\"1.0\" encoding=\"utf-8\"?>\
                   <data type=\"maplist\">\
                   <person>\
                   <name>messi</name>\
                   <age>26</age>\
                   <height>165</height>\
                   <weight>65</weight>\
                   </person>\
                   <person>\
                   <name>kobe</name>\
                   <age>36</age>\
                   <height>195</height>\
                   <weight>65</weight>\
                   </person>\
                   <person>\
                   <name>Alan</name>\
                   <age>26</age>\
                   <height>165</height>\
                   <weight>65</weight>\
                   </person>\
                   /data>";

遍历取到每一个person下面节点的name、age、height、weight的value 和text

TiXmlDocument* myDocument ;

myDocument.Parse(xmlStr));

TiXmlElement* rootElement = myDocument.RootElement();

if (rootElement)
    {
        TiXmlElement* element = rootElement->FirstChildElement();

        if (element)
        {
        
            for (TiXmlNode* SubItem = rootElement->FirstChild();SubItem!=NULL;)
            {
                TiXmlElement* AppNameElement = SubItem->ToElement()->FirstChildElement();

                TiXmlElement* nameElement = AppNameElement->NextSiblingElement();
                TiXmlElement* ageElement = AppPermit_typeElement->NextSiblingElement();
                              
                              TiXmlElement* heightElement = AppPermit_typeElement->NextSiblingElement();

                              TiXmlElement* weightElement = AppPermit_typeElement->NextSiblingElement();

                printf("%s:\t%s\n", nameElement ->Value(), nameElement ->GetText());
                printf("%s:\t%s\n", ageElement ->Value(), ageElement ->GetText());
                printf("%s:\t%s\n", heightElement ->Value(), heightElement ->GetText());
                                printf("%s:\t%s\n", weightElement ->Value(), weightElement ->GetText());

                SubItem=SubItem->NextSibling();
            }
        }
    }

第二种:

   

char* xmlStr = "\<?xml version=\"1.0\" encoding=\"utf-8\"?>\
                   <data type=\"vector\">\
                   <Country>USA</Country>\
                   <Country>China</Country>\
                   </data>";

 

       TiXmlDocument myDocument;

        myDocument.Parse(xmlStr);

        TiXmlElement* rootElement = myDocument.RootElement();

        if (rootElement)
        {
            TiXmlElement* element = rootElement->FirstChildElement();

            if (element)
            {
                for (TiXmlNode* SubItem = rootElement->FirstChild();SubItem!=NULL;)
                {
                    TiXmlElement* ExtNameElement = SubItem->ToElement();

                    printf("%s:\t%s\n", NameElement->Value(), NameElement->GetText());
            
                    SubItem=SubItem->NextSibling();
                }
            }
        }
    }

 注:如果你获取的字符串是Unicode的,必须转码为UTF-8

posted @ 2017-08-23 17:25  车臣  阅读(3162)  评论(0编辑  收藏  举报