どのようにtinyxmlを利用してxmlを操作しますか?

5356 ワード

上のブログでは、ティンサーのツールの仕組みを大体知っています。このブログでは、ティンサーxmlを使ってxmlを操作する方法を詳しく説明します。また、操作中に注意すべき問題があります。まず、tinyxmlソースファイルを自分のプロジェクトに導入します。効果は以下の通りです。     
    実際には、プロジェクトに直接ファイルを追加します。
  もしあなたのシステムがwin 7かofficeが2007以上の場合、ファイルを追加する機能は使えません。結果は:または直接崩壊します。反応がない。解決策は以下の通りです。  https://www.jb51.net/article/32996.htm環境の準備ができましたので、操作を始めましょう。データベーステーブルを操作するように---添削して調べます。このロジックによって、増築から始まります。作成されたフォーマットは以下の通りです。
 
<Persons>
<Person>
<name>lhy</name>
<age>22</age>
</Person>
</Persons>
上のブログでは、inyxml解析器のすべての種類とクラスの関係についても紹介しています。上記のフォーマットのxmlを作成します。コードは以下の通りです。
 
// XML 。
TiXmlDocument *myDocument = new TiXmlDocument();
// 。
TiXmlElement *RootElement = new TiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);
// Person 。
TiXmlElement *PersonElement = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
// name 、age 。
TiXmlElement *NameElement = new TiXmlElement("name");
TiXmlElement *AgeElement = new TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
// name age 。
TiXmlText *NameContent = new TiXmlText("lhy");
TiXmlText *AgeContent = new TiXmlText("22");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
myDocument->SaveFile("d:\\lhy\\xml.txt");//
は、xmlのノード間の関係を把握しさえすれば、作成は問題ではありません。はっきり言えば、世代の関係です。作成はできましたが、C++プログラム猿として書いたら、なんだか違和感があります。あなたもその中の猫の存在を見抜きますか?そうだ、少しのコードの中に大量のNewポインタがあります。C++の中にはjavaのゴミ回収メカニズムがなくてもいいです。自分でこれらの廃棄物を処理しなければなりません。コードにはDelete文がありません。インターネットで資料を調べたら、コードの作成中にDelete文がないことがたくさん分かりました。まさかみんなコピー貼り付けですか?それともtinyxmlがおかしいですか?以下の点をまとめましたが、最終的に開発の過程ではまだ疑問です。しかし、開発の過程では問題が発生しませんでした。だから、私のプログラムはしばらくこのようになりました。言い方の1:多くの文章の中で、newでdeleteがないのは、tinyxmlが自動的に釈放されるためで、自発的に針を破壊して、開発者が手動で釈放する必要はありません。newの出てくるのは自動的に釈放することができますか?newは積み上げて作成したと説明していますが、いつ自動的に釈放されますか?プログラムが終了したら、自動的にリリースされますか?プログラムが終了したとどう判断しますか?モジュールの中で他のモジュールの中のメモリ領域をどのように解析しますか?tinyxmlには自壊機能があるので、ソースコードを調べてみると、本当にそのようなことが分かりました。tinyxmlには、コンストラクタの中で、対応するポインタが放出されています。しかし、ノードごとにそうではない。ソースの詳細:
 
TiXmlNode::~TiXmlNode()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
}
void TiXmlNode::Clear()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
firstChild = 0;
lastChild = 0;
}
私たちはまた、ティンサーxmlのクラスの間に継承関係があることを知っています。tinyxmlのTixmlElement類を見ます。
 
TiXmlElement::~TiXmlElement()
{
ClearThis();
}
void TiXmlElement::ClearThis()
{
Clear();
while( attributeSet.First() )
{
TiXmlAttribute* node = attributeSet.First();
attributeSet.Remove( node );
delete node;
}
}
TixmlElementはTiXml Nodeを継承しています。しかし、TiXml DcumentではTiXml Dcument類の解析関数は発見されていません。第二の言い方:TiXml Dcumentの対象はこの木の根の結点であり、完全な文書の中で、それ以外の結点は子孫でなければならないので、TinyXmlは一つ一つの結点に対応する対象を分析するために巧みな方法を使っています。各結点の解析任務は父に任せました。あるいは父親のClear関数を呼び出して、その子孫は全部正確に分析されますので、ドキュメント全体に対してTiXml Dcumentオブジェクトが正確に解析されていればいいです。作成された上記コードでは、すべてのノードがルートノードの下に掛けられていることを発見した。実はこのコード:myDockment->Link EndChild(RootElement);多形方式を使いました。クラス間の関係は以下の通りです。   また、Link EndChildソースコードは、親タイプTiXml Nodeの方法
 
TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
{
assert( node->parent == 0 || node->parent == this );
assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );
if ( node->Type() == TiXmlNode::DOCUMENT )
{
delete node;
if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
node->parent = this;
node->prev = lastChild;
node->next = 0;
if ( lastChild )
lastChild->next = node;
else
firstChild = node;// it was an empty list.
lastChild = node;
return node;
}
である。ルートノードを削除すると、プログラム内のmyDcumentは、TiXml Nodeを削除することに相当し、TiXml Nodeを呼び出した構文関数に相当する。ネットでこのような方式を言って、構造を分析するのは葉から木の根までです。TiXml Nodeの中のコンストラクションによれば,樹根から葉に至ることができる。しかし、私たちはDelete myDcumentにおいて、文書作成時、つまりプログラムのmyDcumentを注意すべきです。ヒープから作成する場合は、手動でリリースする必要があります。上記のような断片の中で、積み上げる上で作成されました。TiXml Dcument*myDcument=new TiXml Dcument();スタックから作成すると、手動でリリースする必要はなく、プログラムが自動的に構文を呼び出します。同時に、他の元素は山の上で作らなければならないことに注意します。TiXml Nodeの析配関数ではdeleteであるが、スタック上のものはdeleteを必要としないので、ルートノード以外に接続された後裔ノードはヒープから作成しなければならない。私達が説明した結果、tinyxmlの中の原理が分かりましたか?tinyxmlの類の作用と類の間の関係を理解したのでさえすれば、ソースコードを見るのは大丈夫です。このブログは作成されたxmlのデモに基づいてその中の疑問を説明しました。次のブログでは、分析xmlに基づいて、問題点を解決します。