2016年3月6日日曜日

UE4.x XMLのテスト1

プロジェクト名.Build.cs
PublicDependencyModuleNames に XmlParser を追加してビルド
プロジェクト設定/パッケージ化の Additional Non-Asset Directories to Packageに
Content/ThirdPerson/TextFiles を追加した
XMLのパーステスト

#include "XmlParser.h" // <- 追加

// OpenStreetMapのxmlファイルを読み込んでパースするテスト
// TestXml1(TEXT("Content/ThirdPerson/TextFiles/map_0001.osm"));
void TestXml1(const FString& path)
{
 UE_LOG(LogTemp, Display, TEXT("FPaths::GameDir() %s"), *FPaths::GameDir());

 FXmlFile xmlFile;
 xmlFile.LoadFile(FPaths::GameDir() + path);

 FXmlNode* pRoot = xmlFile.GetRootNode();
 if(!pRoot)
 {
  UE_LOG(LogTemp, Error, TEXT("%s RootNode not found"), *path);
  return;
 }

 UE_LOG(LogTemp, Display, TEXT("RootNode Tag %s"), *(pRoot->GetTag()));

 // ルートの子ノードの配列を取得
 const TArray<FXmlNode*>& childNode = pRoot->GetChildrenNodes();
 for(int i = 0; i < childNode.Num(); i++)
 {
  const FString& tag = childNode[i]->GetTag();
  UE_LOG(LogTemp, Display, TEXT("\tChildNode %d Tag %s"), i, *tag);

  if(tag == TEXT("node"))
  {
   UE_LOG(LogTemp, Display, TEXT("\t\tnode content %s"), *(childNode[i]->GetContent()));

   // ノードの属性の配列を取得
   const TArray<FXmlAttribute>& attrib = childNode[i]->GetAttributes();
   for(auto a : attrib)
   {
    const FString& tag = a.GetTag();
    const FString& value = a.GetValue();

    UE_LOG(LogTemp, Display, TEXT("\t\t\t%s = %s"), *tag, *value);
   }
  }
 }
}