UE4 读取XMl 方法一 继续FFastXml

        前面文正提过,FFastXml  类有一个ParseXmlFile方法可以读取XMl,并且可以设置回调函数,就像前文讲的,如果回调函数中再绑定我们自己的委托(蓝图中叫事件调度器),这样就能干很多事了,至于委托在C++中如何使用,请查看官方博主前面的文章以及官网,这里不做详细介绍。

回到正题。

如果要用ParseXmlFile 方法读取XMl ,也很简单。

上步骤:

1 C++项目中创建一个C++Actor类,或者Component类。

2添加声明

bool LoadConfiguration();


//IFastXmlCallback
bool ProcessXmlDeclaration(const TCHAR* ElementData, int32 XmlFileLineNumber);
bool ProcessElement(const TCHAR* ElementName, const TCHAR* ElementData, int32 XmlFileLineNumber);
bool ProcessAttribute(const TCHAR* AttributeName, const TCHAR* AttributeValue);
bool ProcessClose(const TCHAR* Element);
bool ProcessComment(const TCHAR* Comment);
public:
UPROPERTY(BlueprintReadOnly, Category = "MyPlugin")
FString m_IP;


3 CPP文件中添加头文件

// xml header
#include "Engine.h"
#include "Runtime/XmlParser/Public/XmlParser.h"
#include "Runtime/XmlParser/Public/FastXml.h" 


4 添加函数定义



bool AReadXMLActor::LoadConfiguration()
{
FText oOutErrorMessage;
int32 i32ErrorNum;


FString sFilePathName = FPaths::Combine(FPaths::ProjectDir(), TEXT("XML/Setting.xml"));

if (FFastXml::ParseXmlFile((IFastXmlCallback*)this, *sFilePathName, NULL, nullptr, false, false, oOutErrorMessage, i32ErrorNum))
{
GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Yellow, TEXT("Load Setting.xml Successed!"));
return true;
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Yellow, TEXT("Load Setting.xml Failed!"));
GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Yellow, oOutErrorMessage.ToString());
GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Yellow, sFilePathName);
return false;
}




}


bool AReadXMLActor::ProcessXmlDeclaration(const TCHAR* ElementData, int32 XmlFileLineNumber)
{
UE_LOG(LogEngine, Warning, TEXT("ProcessXmlDeclaration ElementData: %s, XmlFileLineNumber: %f"), ElementData, XmlFileLineNumber);
return true;
}


bool AReadXMLActor::ProcessElement(const TCHAR* ElementName, const TCHAR* ElementData, int32 XmlFileLineNumber)
{
FString sElementName = ElementName;
FString sElementData = ElementData;


if (sElementName == TEXT("IP"))
{
m_IP = ElementData;
}
UE_LOG(LogEngine, Warning, TEXT("ProcessElement ElementName: %s, ElementData: %s, XmlFileLineNumber: %f"), ElementName, ElementData, XmlFileLineNumber);


return true;
}


bool AReadXMLActor::ProcessAttribute(const TCHAR* AttributeName, const TCHAR* AttributeValue)
{
UE_LOG(LogEngine, Warning, TEXT("ProcessAttribute AttributeName: %s, AttributeValue: %s"), AttributeName, AttributeValue);
return true;
}


bool AReadXMLActor::ProcessClose(const TCHAR* Element)
{
UE_LOG(LogEngine, Warning, TEXT("ProcessClose Element: %s"), Element);
return true;
}


bool AReadXMLActor::ProcessComment(const TCHAR* Comment)
{
UE_LOG(LogEngine, Warning, TEXT("ProcessComment Comment: %s"), Comment);
return true;
}

5 因为FFastXml::ParseXmlFile((IFastXmlCallback*)this, *sFilePathName, NULL, nullptr, false, false, oOutErrorMessage, i32ErrorNum) 中的this 只能在非静态函数中使用,函数前面又不能加static 成为静态函数,因此只能在这个Actor 类 创建的时候调用LoadConfiguration(); 


6,保存,编译,博主用的4.12版本没问题, 4.18版本 能打开编辑器,一运行就崩溃。 有路过的大神知道错误在哪里的话欢迎留个言告知一下。不胜感激~