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,oOutErrorMessage,i32ErrorNum))
{
GEngine->AddOnScreenDebugMessage(-1,20.0f,FColor::Yellow,TEXT("Load Setting.xml Successed!"));
return true;
}
else
{
GEngine->AddOnScreenDebugMessage(-1,TEXT("Load Setting.xml Failed!"));
GEngine->AddOnScreenDebugMessage(-1,oOutErrorMessage.ToString());
GEngine->AddOnScreenDebugMessage(-1,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,int32 XmlFileLineNumber)
{
FString sElementName = ElementName;
FString sElementData = ElementData;


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


return true;
}


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


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


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

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


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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念