TinyXML教程

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇) 本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我... 阅读详情

TinyXML教程

这是什么?

这个教程对如何有效地使用TinyXML有几个技巧与建议。

我也会尽量包含一些C++的小技巧,如如何将string类型转换为整形和反过来转换。这并不是只针对TinyXML自身,只是因为它或许对你的项目有用,所以我才放在本文的一些地方。

如果你并不了解基本的C++概念,这篇教程对你并没有用。同样地,如果你不知道DOM是什么,先到别的地方了解一下。

在开始之前

一些将要被用到的XML数据组或文件。

example1.xml:

<?xmlversion="1.0" ?>

<Hello>World</Hello>

example2.xml:

<?xml version="1.0" ?>
<poetry>
        <verse>
                 Alas
                   Great World
                          Alas (again)
        </verse>
</poetry>

example3.xml:

<?xml version="1.0" ?>
<shapes>
        <circle name="int-based" x="20" y="30" r="50" />
        <point name="float-based" x="3.5" y="52.1" />
</shapes>

example4.xml

<?xml version="1.0" ?>
<MyApp>
    <!-- Settings for MyApp -->
    <Messages>
        <Welcome>Welcome to MyApp</Welcome>
        <Farewell>Thank you for using MyApp</Farewell>
    </Messages>
    <Windows>
        <Window name="MainFrame" x="5" y="15" w="400" h="250" />
    </Windows>
    <Connection ip="192.168.0.1" timeout="123.456000" />
</MyApp>

开始

从文件中载入XML

从文件导入到TinyXML DOM的最简单方法就是:

TiXmlDocument doc( "demo.xml" );
doc.LoadFile();

下面展示了一个更实用的方法。它会载入文件并且将文件内容显示到STDOUT。

// load the named file and dump its structure to STDOUT
void dump_to_stdout(const char* pFilename)
{
        TiXmlDocument doc(pFilename);
        bool loadOkay = doc.LoadFile();
        if (loadOkay)
        {
                 printf("\n%s:\n", pFilename);
                 dump_to_stdout( &doc ); // defined later in the tutorial
        }
        else
        {
                 printf("Failed to load file \"%s\"\n", pFilename);
        }
}

最简单的证实这个函数的方法是使用像下面一样的main函数:

int main(void)
{
        dump_to_stdout("example1.xml");
        return 0;
}

回顾Example 1中的XML:

<?xml version="1.0" ?>
<Hello>World</Hello>

使用这个XML运行上面的程序将在控制台/DOS窗口中输出如下的结果:

DOCUMENT
+ DECLARATION
+ ELEMENT Hello
  + TEXT[World]

“dump_to_stdout”函数会在本教程的下面重新定义,如果你想理解递归遍历一个DOM,这将非常有用。

程序化创建文档

这是如何程序化构建Example 1:

void build_simple_doc( )
{
        // Make xml: <?xml ..><Hello>World</Hello>
        TiXmlDocument doc;
        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
        TiXmlElement * element = new TiXmlElement( "Hello" );
        TiXmlText * text = new TiXmlText( "World" );
        element->LinkEndChild( text );
        doc.LinkEndChild( decl );
        doc.LinkEndChild( element );
        doc.SaveFile( "madeByHand.xml" );
}

这个文件可以通过如下方法载入并且显示在控制台:

dump_to_stdout("madeByHand.xml"); // 这个函数将会在本教程后续定义

你会发现它与Example 1相同:

madeByHand.xml:
Document
+ Declaration
+ Element [Hello]
  + Text: [World]

这个代码生成完全相同的XML DOM,但是它却展示了创建与连接节点的不同顺序:

void write_simple_doc2( )
{
        // same as write_simple_doc1 but add each node
        // as early as possible into the tree.
 
        TiXmlDocument doc;
        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
        doc.LinkEndChild( decl );
        
        TiXmlElement * element = new TiXmlElement( "Hello" );
        doc.LinkEndChild( element );
        
        TiXmlText * text = new TiXmlText( "World" );
        element->LinkEndChild( text );
        
        doc.SaveFile( "madeByHand2.xml" );
}

这些都产生相同的XML:

<?xml version="1.0" ?>
<Hello>World</Hello>

或者相同的结构:

DOCUMENT
+ DECLARATION
+ ELEMENT Hello
  + TEXT[World]

属性(Attributes)

给一个存在的节点设置属性是简单的:

window = new TiXmlElement( "Demo" );  
window->SetAttribute("name", "Circle");
window->SetAttribute("x", 5);
window->SetAttribute("y", 15);
window->SetDoubleAttribute("radius", 3.14159);

只要你想,你就可以让它通过TiXmlAttribute类实现。

下面的代码展示了一个(并不是唯一)获取节点所有属性的方法,打印名称和字符值,并且如果这些值能够转换为整型或double类型,打印这些值:

// print all attributes of pElement.
// returns the number of attributes printed
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
{
   if ( !pElement ) return 0;
 
   TiXmlAttribute* pAttrib=pElement->FirstAttribute();
   int i=0;
   int ival;
   double dval;
   const char* pIndent=getIndent(indent);
   printf("\n");
   while (pAttrib)
   {
printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());
 
       if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)  printf( " int=%d", ival);
       if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
       printf( "\n" );
       i++;
       pAttrib=pAttrib->Next();
   }
   return i;
}

将文档写入文件

将一个预先构建的DOM写入文件是个简单的事:

doc.SaveFile( saveFilename );

回忆,例如example 4:

<?xml version="1.0" ?>
<MyApp>
    <!-- Settings for MyApp -->
    <Messages>
        <Welcome>Welcome to MyApp</Welcome>
        <Farewell>Thank you for using MyApp</Farewell>
    </Messages>
    <Windows>
        <Window name="MainFrame" x="5" y="15" w="400" h="250" />
    </Windows>
    <Connection ip="192.168.0.1" timeout="123.456000" />
</MyApp>

如下的函数创建了这个DOM并且写入”appsettings.xml“文件:

void write_app_settings_doc( )  
{  
        TiXmlDocument doc;  
        TiXmlElement* msg;
         TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  
        doc.LinkEndChild( decl );  
 
        TiXmlElement * root = new TiXmlElement( "MyApp" );  
        doc.LinkEndChild( root );  
 
        TiXmlComment * comment = new TiXmlComment();
        comment->SetValue(" Settings for MyApp " );  
        root->LinkEndChild( comment );  
 
        TiXmlElement * msgs = new TiXmlElement( "Messages" );  
        root->LinkEndChild( msgs );  
 
        msg = new TiXmlElement( "Welcome" );  
        msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  
        msgs->LinkEndChild( msg );  
 
        msg = new TiXmlElement( "Farewell" );  
        msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));  
        msgs->LinkEndChild( msg );  
 
        TiXmlElement * windows = new TiXmlElement( "Windows" );  
        root->LinkEndChild( windows );  
 
        TiXmlElement * window;
        window = new TiXmlElement( "Window" );  
        windows->LinkEndChild( window );  
        window->SetAttribute("name", "MainFrame");
        window->SetAttribute("x", 5);
        window->SetAttribute("y", 15);
        window->SetAttribute("w", 400);
        window->SetAttribute("h", 250);
 
        TiXmlElement * cxn = new TiXmlElement( "Connection" );  
        root->LinkEndChild( cxn );  
        cxn->SetAttribute("ip", "192.168.0.1");
        cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
        
        dump_to_stdout( &doc );
        doc.SaveFile( "appsettings.xml" );  
} 

函数dump_to_stdout将显示这个结构:

Document
+ Declaration
+ Element [MyApp]
 (No attributes)
  + Comment: [ Settings for MyApp ]
  + Element [Messages]
 (No attributes)
    + Element [Welcome]
 (No attributes)
      + Text: [Welcome to MyApp]
    + Element [Farewell]
 (No attributes)
      + Text: [Thank you for using MyApp]
  + Element [Windows]
 (No attributes)
    + Element [Window]
      + name: value=[MainFrame]
      + x: value=[5] int=5 d=5.0
      + y: value=[15] int=15 d=15.0
      + w: value=[400] int=400 d=400.0
      + h: value=[250] int=250 d=250.0
      5 attributes
  + Element [Connection]
    + ip: value=[192.168.0.1] int=192 d=192.2
    + timeout: value=[123.456000] int=123 d=123.5
    2 attributes

我对TinyXML默认地按照别的APIs所谓的”整洁“方式写XML文档感到奇怪。它改变了包含别的节点的元素文本的空白字符,因此它写成了包含层次嵌套的树状。

我并没有看到有方法去关闭写文件时的缩进,使界限相对简单。

[Lee:这在STL模式时很简单,仅仅只需使用cout<< myDoc。非STL模式总是以“整洁”模式显示。添加一个开关是一个非常好的功能并且正在考虑中。]

XML到C++对象/C++对象到XML

介绍

这个例子结舌你已经学过了从XML文件中导入程序设置与将程序配置写入XML文件,如类似example4.xml。

有许多实现的方法。例如,研究TinyBind项目(http://sourceforge.net/projects/tinybind)。

这个章节介绍一个使用XML读入与写出基本对象结构的悠久方法。

设置你的类对象

以几个基本类开始,就像:

#include <string>
#include <map>
using namespace std;
 
typedef std::map<std::string,std::string> MessageMap;
 
// a basic window abstraction - demo purposes only
class WindowSettings
{
public:
        int x,y,w,h;
        string name;                               
 
        WindowSettings()
                 : x(0), y(0), w(100), h(100), name("Untitled")
        {
        }
 
        WindowSettings(int x, int y, int w, int h, const string& name)
        {
                 this->x=x;
                 this->y=y;
                 this->w=w;
                 this->h=h;
                 this->name=name;
        }
};
 
class ConnectionSettings
{
public:
        string ip;
        double timeout;
};
 
class AppSettings
{
public:
        string m_name;
        MessageMap m_messages;
        list<WindowSettings> m_windows;
        ConnectionSettings m_connection;
 
        AppSettings() {}
 
        void save(const char* pFilename);
        void load(const char* pFilename);
        
        // just to show how to do it
        void setDemoValues()
        {
                 m_name="MyApp";
                 m_messages.clear();
                 m_messages["Welcome"]="Welcome to "+m_name;
                 m_messages["Farewell"]="Thank you for using "+m_name;
                 m_windows.clear();
                 m_windows.push_back(WindowSettings(15,15,400,250,"Main"));
                 m_connection.ip="Unknown";
                 m_connection.timeout=123.456;
        }
};

这是一个基本的main函数,它展示了如何创建一个节本的对象树,并随后保存和载入:

int main(void)
{
        AppSettings settings;
        
        settings.save("appsettings2.xml");
        settings.load("appsettings2.xml");
        return 0;
}

下面的main函数展示创建、修改、保存和载入一个预设的结构:

int main(void)
{
        // block: customise and save settings
        {
                 AppSettings settings;
                 settings.m_name="HitchHikerApp";
                 settings.m_messages["Welcome"]="Don't Panic";
                 settings.m_messages["Farewell"]="Thanks for all the fish";
                 settings.m_windows.push_back(WindowSettings(15,25,300,250,"BookFrame"));
                 settings.m_connection.ip="192.168.0.77";
                 settings.m_connection.timeout=42.0;
 
                 settings.save("appsettings2.xml");
        }
        
        // block: load settings
        {
                 AppSettings settings;
                 settings.load("appsettings2.xml");
                 printf("%s: %s\n", settings.m_name.c_str(), 
                          settings.m_messages["Welcome"].c_str());
                 WindowSettings & w=settings.m_windows.front();
                 printf("%s: Show window '%s' at %d,%d (%d x %d)\n", 
                          settings.m_name.c_str(), w.name.c_str(), w.x, w.y, w.w, w.h);
                 printf("%s: %s\n", settings.m_name.c_str(), settings.m_messages["Farewell"].c_str());
        }
        return 0;
}

当save()与load()结束时(看下面),运行main()在控制台上显示:

HitchHikerApp: Don't Panic
HitchHikerApp: Show window 'BookFrame' at 15,25 (300 x 100)
HitchHikerApp: Thanks for all the fish

C++ XML编码

实现保存到一个文件有很多种方法。这就是其中之一:

void AppSettings::save(const char* pFilename)
{
        TiXmlDocument doc;  
        TiXmlElement* msg;
        TiXmlComment * comment;
        string s;
         TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  
        doc.LinkEndChild( decl ); 
 
        TiXmlElement * root = new TiXmlElement(m_name.c_str());  
        doc.LinkEndChild( root );  
 
        comment = new TiXmlComment();
        s=" Settings for "+m_name+" ";
        comment->SetValue(s.c_str());  
        root->LinkEndChild( comment );  
 
        // block: messages
        {
                 MessageMap::iterator iter;
 
                 TiXmlElement * msgs = new TiXmlElement( "Messages" );  
                 root->LinkEndChild( msgs );  
 
                 for (iter=m_messages.begin(); iter != m_messages.end(); iter++)
                 {
                          const string & key=(*iter).first;
                          const string & value=(*iter).second;
                          msg = new TiXmlElement(key.c_str());  
                          msg->LinkEndChild( new TiXmlText(value.c_str()));  
                          msgs->LinkEndChild( msg );  
                 }
        }
 
        // block: windows
        {
                 TiXmlElement * windowsNode = new TiXmlElement( "Windows" );  
                 root->LinkEndChild( windowsNode );  
 
                 list<WindowSettings>::iterator iter;
 
                 for (iter=m_windows.begin(); iter != m_windows.end(); iter++)
                 {
                          const WindowSettings& w=*iter;
 
                          TiXmlElement * window;
                          window = new TiXmlElement( "Window" );  
                          windowsNode->LinkEndChild( window );  
                          window->SetAttribute("name", w.name.c_str());
                          window->SetAttribute("x", w.x);
                          window->SetAttribute("y", w.y);
                          window->SetAttribute("w", w.w);
                          window->SetAttribute("h", w.h);
                 }
        }
 
        // block: connection
        {
                 TiXmlElement * cxn = new TiXmlElement( "Connection" );  
                 root->LinkEndChild( cxn );  
                 cxn->SetAttribute("ip", m_connection.ip.c_str());
                 cxn->SetDoubleAttribute("timeout", m_connection.timeout); 
        }
 
        doc.SaveFile(pFilename);  
}

修改main函数并且运行它会产生如下的文件:

<?xml version="1.0" ?>
<HitchHikerApp>
    <!-- Settings for HitchHikerApp -->
    <Messages>
        <Farewell>Thanks for all the fish</Farewell>
        <Welcome>Don&apos;t Panic</Welcome>
    </Messages>
    <Windows>
        <Window name="BookFrame" x="15" y="25" w="300" h="250" />
    </Windows>
    <Connection ip="192.168.0.77" timeout="42.000000" />
</HitchHikerApp>

XML解码

与对象编码类似,有很多方法将XML解码成C++对象结构。下面的方法使用了TiXmlHandles:

void AppSettings::load(const char* pFilename)
{
        TiXmlDocument doc(pFilename);
        if (!doc.LoadFile()) return;
 
        TiXmlHandle hDoc(&doc);
        TiXmlElement* pElem;
        TiXmlHandle hRoot(0);
 
        // block: name
        {
                 pElem=hDoc.FirstChildElement().Element();
                 // should always have a valid root but handle gracefully if it does
                 if (!pElem) return;
                 m_name=pElem->Value();
 
                 // save this for later
                 hRoot=TiXmlHandle(pElem);
        }
 
        // block: string table
        {
                 m_messages.clear(); // trash existing table
 
                 pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
                 for( pElem; pElem; pElem=pElem->NextSiblingElement())
                 {
                          const char *pKey=pElem->Value();
                          const char *pText=pElem->GetText();
                          if (pKey && pText) 
                          {
                                   m_messages[pKey]=pText;
                          }
                 }
        }
 
        // block: windows
        {
                 m_windows.clear(); // trash existing list
 
                 TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
                 for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
                 {
                          WindowSettings w;
                          const char *pName=pWindowNode->Attribute("name");
                          if (pName) w.name=pName;
                          
                          pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left as-is
                          pWindowNode->QueryIntAttribute("y", &w.y);
                          pWindowNode->QueryIntAttribute("w", &w.w);
                          pWindowNode->QueryIntAttribute("hh", &w.h);
 
                          m_windows.push_back(w);
                 }
        }
 
        // block: connection
        {
                 pElem=hRoot.FirstChild("Connection").Element();
                 if (pElem)
                 {
                          m_connection.ip=pElem->Attribute("ip");
                          pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
                 }
        }
}

完整的dump_to_stdout

下面是一个可以复制与粘贴的程序例子,它可以载入XML属性和通过前面提到的递归遍历方式将这种结构展示到STDOUT。

// tutorial demo program
#include "stdafx.h"
#include "tinyxml.h"
 
// ----------------------------------------------------------------------
// STDOUT dump and indenting utility functions
// ----------------------------------------------------------------------
const unsigned int NUM_INDENTS_PER_SPACE=2;
 
const char * getIndent( unsigned int numIndents )
{
        static const char * pINDENT="                                      + ";
        static const unsigned int LENGTH=strlen( pINDENT );
        unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
        if ( n > LENGTH ) n = LENGTH;
 
        return &pINDENT[ LENGTH-n ];
}
 
// same as getIndent but no "+" at the end
const char * getIndentAlt( unsigned int numIndents )
{
        static const char * pINDENT="                                        ";
        static const unsigned int LENGTH=strlen( pINDENT );
        unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
        if ( n > LENGTH ) n = LENGTH;
 
        return &pINDENT[ LENGTH-n ];
}
 
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
{
        if ( !pElement ) return 0;
 
        TiXmlAttribute* pAttrib=pElement->FirstAttribute();
        int i=0;
        int ival;
        double dval;
        const char* pIndent=getIndent(indent);
        printf("\n");
        while (pAttrib)
        {
                 printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());
 
                 if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
                 if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
                 printf( "\n" );
                 i++;
                 pAttrib=pAttrib->Next();
        }
        return i;        
}
 
void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 )
{
        if ( !pParent ) return;
 
        TiXmlNode* pChild;
        TiXmlText* pText;
        int t = pParent->Type();
        printf( "%s", getIndent(indent));
        int num;
 
        switch ( t )
        {
        case TiXmlNode::TINYXML_DOCUMENT:
                 printf( "Document" );
                 break;
 
        case TiXmlNode::TINYXML_ELEMENT:
                 printf( "Element [%s]", pParent->Value() );
                 num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
                 switch(num)
                 {
                          case 0:  printf( " (No attributes)"); break;
                          case 1:  printf( "%s1 attribute", getIndentAlt(indent)); break;
                          default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
                 }
                 break;
 
        case TiXmlNode::TINYXML_COMMENT:
                 printf( "Comment: [%s]", pParent->Value());
                 break;
 
        case TiXmlNode::TINYXML_UNKNOWN:
                 printf( "Unknown" );
                 break;
 
        case TiXmlNode::TINYXML_TEXT:
                 pText = pParent->ToText();
                 printf( "Text: [%s]", pText->Value() );
                 break;
 
        case TiXmlNode::TINYXML_DECLARATION:
                 printf( "Declaration" );
                 break;
        default:
                 break;
        }
        printf( "\n" );
        for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
        {
                 dump_to_stdout( pChild, indent+1 );
        }
}
 
// load the named file and dump its structure to STDOUT
void dump_to_stdout(const char* pFilename)
{
        TiXmlDocument doc(pFilename);
        bool loadOkay = doc.LoadFile();
        if (loadOkay)
        {
                 printf("\n%s:\n", pFilename);
                 dump_to_stdout( &doc ); // defined later in the tutorial
        }
        else
        {
                 printf("Failed to load file \"%s\"\n", pFilename);
        }
}
 
// ----------------------------------------------------------------------
// main() for printing files named on the command line
// ----------------------------------------------------------------------
int main(int argc, char* argv[])
{
        for (int i=1; i<argc; i++)
        {
                 dump_to_stdout(argv[i]);
        }
        return 0;
}

在命令行或者DOS窗口中运行,如下:

C:\dev\tinyxml> Debug\tinyxml_1.exe example1.xml
 
example1.xml:
Document
+ Declaration
+ Element [Hello]
 (No attributes)
  + Text: [World]
 
 
注:本文翻译自TinyXML的源码文档,如果不恰当之处,请不吝赐教,谢谢!
掌握TinyXML:源代码分析与应用实践教程 TinyXML是一个轻量级的C++ XML解析库,由Lee Thomason设计并开发。它的设计初衷是为了提供一个简单、易于使用的XML解析工具,使得在资源受限的环境下,如嵌入式系统,开发者也能轻松地处理XML文档。Lee的初衷是创造一个小型且性能优越的库,同时在接口设计上保持直观和简洁,使得初学者也能快速上手。TiXmlDocument类是所有TinyXML文档的根节点,代表了整个XML文档结构的容器。它可以加载一个XML文件或者通过编程创建新的文档内容。 阅读详情

相关推荐

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 672

TinyXml入门简易教程.

TinyXML开发无非就是对XML文档进行读写操作,网上开到的各种参考资料看的我头的大了,简而言之就是不合适.   一:读操作 假设有info.xml这个文件,然后将info.xml文件中的相关内容读出来.     info.xml                                                             周星星         2

山水人间。 1万+

海外跨境电商商城源码-进出口电商平台网站-多语言多商户平台

我们的海外跨境电商系统源码还包括各种功能模块,如用户管理、商品管理、订单管理等。支付管理:与主流支付平台(如Stripe、PayPal等)的集成,支持多种支付方式;订单管理:创建订单、支付订单、取消订单等操作,以及订单状态查询和历史记录;购物车管理:添加商品到购物车、查看购物车、修改购物车中的商品数量等操作;商品管理:商品信息录入、编辑、删除等操作,以及商品分类和搜索功能。客服管理:在线咨询、投诉处理等功能,提供更好的用户服务。用户管理:注册、登录、忘记密码、个人资料。# 检查电子邮件地址是否有效。

柏诣科技的博客 2658

TinyXML入门教程

  TinyXML入门教程2008年12月29日 星期一 13:59 转自http://hi.baidu.com/dancingwind_zw TinyXML入门教程 1什么是XML? 1文档类 2创建文档对象 3输出文档对象 3保存文档对象 4返回第一个根元素 5声明类 5注释类 6元素类 6节点名 6父节点 6子节点 7编辑子节点 7同级节点 7遍历

shangguanwaner的专栏 7206

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 377

数据工程师——ETL

文章摘要 ETL(数据抽取、转换、加载)是数据处理的核心流程,负责将分散数据源整合为高质量数据。ETL与ELT的主要区别在于转换步骤顺序,分别适用于不同规模数据场景。数据仓库通过ETL从多个数据源集成数据,支持分析决策。维度建模中的事实表记录业务指标,维度表提供上下文信息。缓慢变化维度(SCD)处理随时间变化的维度数据,常见类型包括直接覆盖型、新增版本型等。数据清洗解决数据缺失、重复、错误等问题,确保数据质量。数据血缘记录数据流转路径,便于问题排查和影响分析。常用ETL工具如Kettle通过转换和作业实现数

weixin_45729710的博客 1559

【亲测免费】 TinyML 开源项目使用教程

TinyML 项目的目录结构如下: ``` tinyml/ ├── docs/ ├── examples/ ├── src/ │ ├── core/ │ ├── utils/ │ └── main.py ├── tests/ ├── .gitignore ├── LICENSE ├── README.md └── requirements.txt ``` ### 目录介绍 - *...

gitblog_00339的博客 723

手把手教你用Gazebo+ROS搭建智能小车机械臂系统(含完整配置文件)

本文提供了一份详细的实践指南,手把手教你使用Gazebo和ROS搭建智能小车机械臂仿真系统。内容涵盖从URDF/Xacro模型设计、Gazebo控制器配置到ROS话题通信与系统集成的完整流程,并提供了可复用的配置文件与调试技巧,帮助开发者快速构建并控制一个功能完备的移动操作机器人平台。

sugar的博客 971

【亲测免费】 TinyML 项目教程

``` tinyml/ ├── data/ │ ├── raw/ │ └── processed/ ├── models/ │ ├── __init__.py │ ├── model1.py │ └── model2.py ├── notebooks/ │ ├── exploration.ipynb │ └── training.ipynb ├── scripts/ │...

gitblog_00044的博客 611

[ATF]-smc指令详解

1、在ree/tee调用smc之前 2、调用smc之后,cpu触发同步异常,进入ATF的sync_exception_aarch64—>handle_sync_exception—>smc_handler64处理函数 在smc_handler64中又调用了smc_handler func smc_handler64 /* ---------------------------------------------- * Detect if this is a RUN_IMAGE or ot

baron-周贺贺-代码改变世界ctw 1万+

AES加密算法及AES-CMAC原理白话版系统解析

对AES不同加密算法,加密模式,加密原理,填充算法及AES-CMAC算法的详细系统介绍,帮助大家对AES进行系统掌握。

initiallizer的博客 4068

快速上手 TinyXML-2 不完全教程

TinyXML-2 不完全教程 XML 作为程序开发中非常常用的数据文档之一,各个语言或是开发环境都有对应的用于处理 XML 文件的库。在 C++ 语言中,TinyXML-2 就是这样的一个库。 TinyXML-2 是一个简单,小巧,高性能的 C++ 的 XML 解析器,它能够容易地集成到其他程序中。 与 TinyXML-2 有关的两个网页如下: GitHub 主页:https://github.com/leethomason/tinyxml2 在线帮助文档:http://leethomason.git

李斯维的博客空间 5587

DeepSmote:一种深度SMOTE方法

DeepSmote 一种全新的将深度学习与Smote相结合的过采样方法! 目前在许多领域已经被使用,值得大家关注学习!

走在深度学习前沿的小宋 1447

tinyxml2的入门教程

xml 是一种标记型文档,有两种基本解析方式:DOM(Document Object Model,文档对象模型)和SAX(Simple APIs for XML,简单应用程序接口)。DOM 将 xml 文档全部内容解析成一个对象模型树,通过对这个对象模型进行操作来实现对数据的操作。优点:– 解析成树的结构对象,可以实现增删改操作缺点:– 当 xml 文件过大时,比较占用内存SAX 以事务为驱动,对 xml 文档从上之下,一行一行解析,当解析到事务对象则返回。

ReLesEason的博客 2001

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TinyXML2使用教程

我最近开始学C++编程。在查找TinyXML2使用教程时,感觉写得都很笼统。看了源码,我决定自己写一个教程。 TINYXML2源码地址:https://github.com/leethomason/tinyxml2/blob/master/xmltest.cpp需要在头文件里面添加#include "tinyxml2.h"。同时编译时加入tinyxml2.cpp。 另声明命令空间 using na...

koganlee的博客 3162

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TinyXML基础教程

开始之前 一些 XML 数据集/文件将会被用到: example1.xml: World example2.xml:                        Alas                  Great World                        Alas (again)         example3.xml:

没难度、有态度、不泄气、不放弃 546

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【转】TinyXML2 入门教程

转自:TinyXML2 入门教程_恋喵大鲤鱼的博客-优快云博客_tinyxml2中文指南 代码编译运行环境:Linux 64bits + Debug + g++ -m64(-m 表示生成 64bits 的程序) 文章目录 1.TinyXML2 概述 2. TinyXML1 与 TinyXML2 对比 3. TinyXML2 用法用例 3.1 创建 XML 文件 3.2 增加 XML 文件的节点 3.3 查询 XML 文件的指定节点 3.4 修改 XML 文件的指定节点

sinolover的专栏 915

tinyxml c语言,开源TinyXML 最简单的新手教程

TinyXML它是基于一个非常受欢迎的现在DOM型号XML解析器,简单易用且小巧玲珑,很适合存储简单数据。配置文件。当前最新版本号是2.6.2先看一下源代码文档的结构:Docs是帮助文档。里边有许多的使用说明,只截一张图看一下:详细依据须要再看我们使用的是它的库。能够是静态的也能够是动态库。我就用静态库了,将这里边的几个头文件和源文件一起创建一个project,生成Lib库:tinyxml.lib...

weixin_39928844的博客 407

【转载】TinyXML2使用教程

原文见 https://blog.youkuaiyun.com/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。 TinyXML2详细介绍与源码获取方法详见:Tin...

gdamichael的博客 440

tinyXML入门教程

什么是XML?XML全称EXtensible Markup Language,翻译为可扩展标记语言,简而言之就是你可以自定义数据的标识,以此来区分各种不同的数据,以便于进行数据交换,例如html就可以理解为一种简单的xml语言。XML文件通常就是一个文本文件,可以使用任何编码。  上图就是我系统中一个x

向往大海专栏 1032
上一篇: TinyXML参考文档
下一篇: C++头文件----<cstdio>(stdio.h)
henrik_he
博客等级 码龄16年 36粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值