前面文正提过,FFastXml 类有一个ParseXmlFile方法可以读取XMl,并且可以设置回调函数,就像前文讲的,如果回调函数中再绑定我们自己的委托(蓝图中叫事件调度器),这样就能干很多事了,至于委托在C++中如何使用,请查看官方博主前面的文章以及官网,这里不做详细介绍。@H_502_2@
回到正题。@H_502_2@
如果要用ParseXmlFile 方法读取XMl,也很简单。@H_502_2@
上步骤:@H_502_2@
1 C++项目中创建一个C++Actor类,或者Component类。@H_502_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;@H_502_2@
@H_502_2@
// xml header
#include "Engine.h"
#include "Runtime/XmlParser/Public/XmlParser.h"
#include "Runtime/XmlParser/Public/FastXml.h"
@H_502_2@
@H_502_2@
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;
}
@H_502_2@
5 因为FFastXml::ParseXmlFile((IFastXmlCallback*)this,i32ErrorNum) 中的this 只能在非静态函数中使用,函数前面又不能加static 成为静态函数,因此只能在这个Actor 类 创建的时候调用LoadConfiguration();@H_502_2@
@H_502_2@
6,保存,编译,博主用的4.12版本没问题, 4.18版本 能打开编辑器,一运行就崩溃。 有路过的大神知道错误在哪里的话欢迎留个言告知一下。不胜感激~@H_502_2@