官方基本介绍

4 篇文章 0 订阅

一. 特性

1.----------------------------------------------------------------------------------------------------------------------------------

<使用STL> ----如果使用STL,则会使用std::string类,而且完全支持std::istram,std::ostream,operator<< >>.去多API都有const char* 和string&两个     版本。

<不适用STL>---如果被编译不使用STL,则任何STL都不会被包含。所有string类都由TinyXML自己实现。所有API 只提供const char *传入参数。

使用运行时定义:TIMXL_USE_STL.  这可以做为参数传给编译器或者在“tinyxml.h”文件的第一行进行设置。


2.----------------------------------------------------------------------------------------------------------------------------------

<UTF-8>Tiny支持UTF-8,所以可以处理任何语言的XML文件。而且TinyXML也支持"Legacy(遗产)模式"--一种在UTF-8之前的模式,可以成为扩展的Ascii.

正常情况下,TinyXML会检测出正确的编码并使用它。然后,通过设置头文件中的TIMXL_DEFAULT_ENCODING值,TinyXML可以强制使用一种编码。

除非以下情况发生,否则TinyXML会默认使用Legacy模式:

  1. 如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始,TinyXML会以UTF-8的方式来读取它。
  2. 如果包含有encoding="UTF-8"的声明被读取,那么TinyXML会以UTF-8的方式来读取它。
  3. 如果读取到没有指定编码方式的声明,那么TinyXML会以UTF-8的方式来读取它。
  4. 如果包含有encoding=“其它编码”的声明被读取,那么TinyXML会以Legacy模式来读取它。在Legacy模式下,TinyXML会像以前那样工作,虽然已经不是很清楚这种模式是如何工作的了,但旧的内容还得保持能够运行。
  5. 除了上面提到的情况,TinyXML会默认运行在Legacy模式下。
3.----------------------------------------------------------------------------------------------------------------------------------
<实体>  TinyXML认得预定义的特殊“字符实体”,即

&amp; &
&lt; <
&gt; >
&quot; "
&apos; ‘

这些在XML文档读取时都会被辨认出来,并会被转化成等价的UTF-8字符。比如下面的XML文本: Far &amp; Away

从TiXmlText 对象查询出来时会变成"Far & Away"这样的值,而写回XML流/文件时会以“&amp;”的方式写回。老版本的TinyXML“保留”了字符实体,而在新版本中它们会被转化成字符串。

另外,所有字符都可以用它的Unicode编码数字来指定, " "和" "都表示不可分的空格字符。


4.----------------------------------------------------------------------------------------------------------------------------------

<打印>

TinyXML有几种不同的方式来打印输出,当然它们各有各的优缺点。

  • Print( FILE* ):输出到一个标准C流中,包括所有的C文件和标准输出。
    • "相当漂亮的打印", 但你没法控制打印选项。
    • 输出数据直接写到FILE对象中,所以TinyXML代码没有内存负担。
    • 被Print()和SaveFile()调用。

     

  • operator<<:输出到一个c++流中。
    • 与C++ iostreams集成在一起。
    • 在"network printing"模式下输出没有换行符,这对于网络传输和C++对象之间的XML交换有好处,但人很难阅读。
  • TiXmlPrinter:输出到一个std::string或者内存缓冲区中。
    • API还不是很简练。
    • 将来会增加打印选项。
    • 在将来的版本中可能有些细微的变化,因为它会被改进和扩展。

5.----------------------------------------------------------------------------------------------------------------------------------

<流>

设置了TIXML_USE_STL,TinyXML就能支持C++流(operator <<,>>)和C(FILE*)流。但它们之间有些差异你需要知道:

C风格输出:

  • 基于FILE*
  • 用Print()和SaveFile()方法

生成具有很多空格的格式化过的输出,这是为了尽可能让人看得明白。它们非常快,而且能够容忍XML文档中的格式错误。例如一个XML文档包含两个根元素和两个声明仍然能被打印出来。

C风格输入:

  • 基于FILE*
  • 用Parse()和LoadFile()方法

速度快,容错性好。当你不需要C++流时就可以使用它。

C++风格输出:

  • 基于std::ostream
  • operator<<

生成压缩过的输出,目的是为了便于网络传输而不是为了可读性。它可能有些慢(可能不会),这主要跟你系统上ostream类的实现有关。无法容忍格式错误的XML:此文档只能包含一个根元素。另外根级别的元素无法以流形式输出。

C++风格输入:

  • 基于std::istream
  • operator>>

从流中读取XML使其可用于网络传输。通过些小技巧,它知道当XML文档读取完毕时,流后面的就一定是其它数据了。TinyXML总假定当它读取到根结点后XML数据就结束了。换句话说,那些具有不止一个根元素的文档是无法被正确读取的。另外还要注意由于STL的实现和TinyXML的限制,operator>>会比Parse慢一些。

6.----------------------------------------------------------------------------------------------------------------------------------

<空格>

对是保留还是压缩空格这一问题人们还没达成共识。举个例子,假设‘_’代表一个空格,对于"Hello____world",HTML和某些XML解析器会解释成"Hello_world",它们压缩掉了一些空格。而有些XML解析器却不会这样,它们会保留空格,于是就是“Hello____world”(记住_表示一个空格)。其它的还建议__Hello___world__应该变成Hello___world 。

这是一个解决得不能让我满意的问题。TinyXML一开始就两种方式都支持。调用TiXmlBase::SetCondenseWhiteSpace( bool )来设置你想要的结果,默认是压缩掉多余的空格。

如果想要改变默认行为,你应该在解析任何XML数据之前调用TiXmlBase::SetCondenseWhiteSpace( bool ) ,而且我不建议设置之后再去改动它。


7.----------------------------------------------------------------------------------------------------------------------------------

<句柄>

想要一个健壮地读取一个XML文档,检查方法调用后的返回值是否为NULL是很重要的。一种安全的检错机制可能会产生像这样的代码:

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
    TiXmlElement* element = root->FirstChildElement( "Element" );
    if ( element )
    {
        TiXmlElement* child = element->FirstChildElement( "Child" );
        if ( child )
        {
            TiXmlElement* child2 = child->NextSiblingElement( "Child" );
            if ( child2 )
            {
                // Finally do something useful.

用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
这样处理就容易多了,查询TiXmlHandle得到更多的信息。


8.----------------------------------------------------------------------------------------------------------------------------------

<行列追踪>

对于某些应用程序来说,能够追踪节点和属性在它们源文件中的原始位置是很重要的。另外,知道解析错误在源文件中的发生位置可以节省大量时间。

TinyXML能够追踪所有结点和属性在文本文件中的行列原始位置。

TiXmlBase::Row() 和 TiXmlBase::Column() 方法返回结点在源文件中的原始位置。

正确的制表符号可以经由TiXmlDocument::SetTabSize() 来配置。

9.----------------------------------------------------------------------------------------------------------------------------------

<在某一应用程序中使用:>

把tinyxml.cpp,tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, 和 tinystr.h 添加到你的项目和makefile中。就这么简单,它可以在任何合理的C++适用系统上编译。不需要为TinyXML打开异常或者运行时类型信息支持。

10.---------------------------------------------------------------------------------------------------------------------------------

<tinyxml怎么工作>

举个例子可能是最好的办法,理解一下:

 

<?xml version="1.0" standalone=no>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>

它称不上是一个To Do列表,但它已经足够了。像下面这样读取并解析这个文件(叫“demo.xml”)你就能创建一个文档:

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

现在它准备好了,让我们看看其中的某些行和它们怎么与DOM联系起来。

 

<?xml version="1.0" standalone=no>

第一行是一个声明,它会转化成TiXmlDeclaration 类,同时也是文档结点的第一个子结点。

这是TinyXML唯一能够解析的指令/特殊标签。一般来说指令标签会保存在TiXmlUnknown 以保证在它保存回磁盘时不会丢失这些命令。

 

<!– Our to do list data –>

这是一个注释,会成为一个TiXmlComment对象。

 

<ToDo>

"ToDo"标签定义了一个TiXmlElement 对象。它没有任何属性,但包含另外的两个元素。

 

<Item priority="1">

生成另一个TiXmlElement对象,它是“ToDo”元素的子结点。此元素有一个名为“priority”和值为“1”的属性。

 

Go to the

TiXmlText ,这是一个叶子结点,它不能再包含其它结点,是"Item" TiXmlElement的子结点。

 

<bold>

另一个TiXmlElement, 这也是“Item”元素的子结点。

等等

最后,看看整个对象树:

 

TiXmlDocument "demo.xml"
TiXmlDeclaration "version=’1.0′" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills"

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wireshark是一款开源的网络封包分析软件,它可以用于捕获和分析网络数据包。通过Wireshark,您可以查看网络通信中传输的数据,了解网络流量、协议和通信问题。以下是Wireshark的基本介绍和学习方法: 1. 下载和安装:您可以从Wireshark官方网站(https://www.wireshark.org/)下载适用于您操作系统的安装包,并按照安装向导进行安装。 2. 捕获数据包:打开Wireshark后,选择要捕获数据包的网络接口,然后点击“开始”按钮开始捕获数据包。Wireshark将会显示捕获到的数据包列表。 3. 分析数据包:在捕获到的数据包列表中,您可以选择特定的数据包进行详细分析。Wireshark提供了丰富的过滤和搜索功能,可以帮助您快速定位和分析感兴趣的数据包。 4. 查看详细信息:选择一个数据包后,Wireshark将显示该数据包的详细信息,包括源地址、目标地址、协议类型、数据长度等。您还可以查看数据包的原始数据和解析后的协议信息。 5. 学习资源:Wireshark提供了官方的用户手册和文档,您可以在官方网站上找到详细的使用说明和教程。此外,还有许多在线教程和视频资源可供学习和参考。 6. 实践和练习:为了更好地掌握Wireshark的使用,建议您进行实际的网络捕获和分析练习。可以尝试在本地网络或虚拟机环境中进行捕获和分析,以加深对网络通信和协议的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值