0


私は現在、xml ファイルからいくつかのものを読み取る必要がある C++ のプロジェクトに取り組んでいます。tinyxml の縫い目が進むべき道であることがわかりましたが、まだ正確な方法がわかりません。
また、私の xml ファイルは、これを使用する必要があるユーザーごとに少し異なるように見えるため、少し注意が必要です。

読み取る必要があるxmlファイルは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<cloud_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx xmlns:d="http://www.kuju.com/TnT/2003/Delta" d:version="1.0">
    <cCareerModel d:id="154964152">
        <ScenarioCareer>
            <cScenarioCareer d:id="237116344">
                <IsCompleted d:type="cDeltaString">CompletedSuccessfully</IsCompleted>
                <BestScore d:type="sInt32">0</BestScore>
                <LastScore d:type="sInt32">0</LastScore>
                <ID>
                    <cGUID>
                        <UUID>
                            <e d:type="sUInt64">5034713268864262327</e>
                            <e d:type="sUInt64">2399721711294842250</e>
                        </UUID>
                        <DevString d:type="cDeltaString">0099a0b7-e50b-45de-8a85-85a12e864d21</DevString>
                    </cGUID>
                </ID>
            </cScenarioCareer>
        </ScenarioCareer>
        <MD5 d:type="cDeltaString"></MD5>
    </cCareerModel>
</cloud_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>

このプログラムの目標は、(変数を介して) 文字列を挿入し、対応する「cScenarioCarrer d:id」を検索して、「IsComplete」と「BestScore」を読み取れるようにすることです。

これらの文字列は、後でプログラムで処理する必要がありますが、処理できます。

ここでの私の質問は

A. 特定の「cScenarioCareer」ID を検索して移動するにはどうすればよいですか

B. "IsComplete" と "BestScore" をプログラムのいくつかの変数に貼り付けるにはどうすればよいですか?

注: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 文字列はユーザ​​ーごとに一意であるため、何でもかまいません。

誰かが私を助けてくれるなら、私はとても優雅です、ありがとう。

PS。「このコードをプログラムに貼り付けてください」という答えは受け入れられますが、ここで何をしているのかをある程度理解したいと思います。

4

1 に答える 1

1

これは C++ で行っているため、ticpp.googlecode.com で入手できる TinyXml への ticpp インターフェイスを使用して、この例を作成します。

仮定:

  • 特定の xml ファイルには、1 つの<cloud>タグと複数の <cCareerModel>タグが含まれます。
  • それぞれ<cCareerModel>に単一のタグが含まれ、そのタグには単一の<ScenarioCareer>タグが含まれ<cScenarioCareer>ます
  • xml ファイルを xmlDoc という TiXmlDocument に解析しました。
  • データ型属性を調べる必要はありません
  • 例外を使用しても構いません

<cloud>また、次のように、タグへのポインターを含むコンテキスト変数がどこかにあると仮定します 。

ticpp::Element* cloud = xmlDoc.FirstChildElement("cloud");

指定された ID を持つ cScenarioCareer の ticpp::Element を見つける関数を次に示します。

ticpp::Element* findScenarioCareer(const std::string& careerId)
{
  try
  {
    // Declare an iterator to access all of the cCareerModel tags and construct an
    // end iterator to terminate the loop
    ticpp::Iterator<ticpp::Element> careerModel;
    const ticpp::Iterator<ticpp::Element> modelEnd = careerModel.end();

    // Loop over the careerModel tags
    for (careerModel = cloud->FirstChildElement() ; careerModel != modelEnd ;
         ++careerModel)
    {
      // Construct loop controls to access careers
      ticpp::Iterator<ticpp::Element> career;
      const ticpp::Iterator<ticpp::ELement> careerEnd = career.end();

      // Loop over careers
      for (career = careerModel->FirstChildElement("ScenarioCareer").FirstChildElement() ; 
           career != careerEnd ; ++career)
      {
        // If the the d:id attribute value matches then we're done
        if (career->GetAttributeOrDefault("d:id", "") == careerId)
          return career;
      }
    }
  }
  catch (const ticpp::Exception&)
  {
  }
  return 0;
}

次に、必要な情報を取得するには、次のようにします。

std::string careerId = "237116344";
std::string completion;
std::string score;
ticpp::Element* career = findScenarioCareer(careerId);
if (career)
{
  try
  {
    completion = career->FirstChildElement("IsCompleted")->GetText();
    score = career->FirstChildElement("BestScore")->GetText();
  }
  catch (const ticpp::Exception&)
  {
    // Handle missing element condition
  }
}
else
{
  // Not found
}

当然、私はこれをコンパイルしたりテストしたりしていませんが、アイデアが得られるはずです。

于 2011-10-01T18:20:06.570 に答える