• UE4 Xml读写


    UE4自带一个XmlParser,可以很方便的实现Xml的读写。

    1,在PublicDependencyModuleNames.AddRange中添加XmlParser。

    2,include XmlParser.h

    读写操作封装在了xmlobject  需要根据需求增加 修改

    xmlobject.h

    // Fill out your copyright notice in the Description page of Project Settings.
    
    #pragma once
    
    #include "CoreMinimal.h"
    #include <map>
    
    /**
     * 
     */
    struct NodeStruct
    {
        FString tag;
        FString content;
    
        NodeStruct(FString Tag,FString Content)
        {
            tag = Tag;
            content = Content;
        }
    };
    
    class TESTJIGOU_API XmlFileObject
    {
    public:
        XmlFileObject(const FString &filePath, const FString &fileName,int NodeCount = 0,...);
        ~XmlFileObject();
    
    public:
        class FXmlFile* m_File;
        class FXmlNode* m_RootNode;
        FString m_FilePath;
        FString m_FileName;
        bool loadFileSuccess;
    
    public:
        bool SetNode(const FString &tag, const FString &content);
        bool SetNode(const FString &tag, int content);
        bool SetNode(const FString &tag, float content);
    
        bool AddChild(const FString &ParentNodeTag,const FString& ChildNodeTag,const FString &ChildNodeContent);
        bool AddChild(FXmlNode* ParentNode, const FString& ChildNodeTag, const FString& ChildNodeContent);
        
    
        FXmlNode* GetNode(const FString& tag,const FString &content);
    
    
        FXmlNode* GetChildNode(FXmlNode* TargetNode, const FString& ChildTag);
        FXmlNode* GetChildNode(FXmlNode* TargetNode, const FString& ChildTag, const FString& ChildContent);
    
        const TCHAR* GetChildNodeContent(FXmlNode* TargetNode, const FString& ChildTag);
    
        const TCHAR* GetNodeContent(const FString &tag);
    
    private:
        void Save();
    };
    xmlobject.h

    xmlobject.cpp

    // Fill out your copyright notice in the Description page of Project Settings.
    
    #include "XmlFileObject.h"
    #include "XmlParser.h"
    #include "Engine.h"
    #include "stdarg.h"
    
    XmlFileObject::XmlFileObject(const FString &filePath, const FString &fileName,int NodeCount, ...) : m_FileName(fileName), m_FilePath(filePath)
    {
        m_File = new FXmlFile(filePath + fileName);
        
        if (m_File == nullptr)
        {
            GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("打开Xml文件失败啦"));
            loadFileSuccess = false;
        }
        else
        {
            m_RootNode = m_File->GetRootNode();
    
            if (m_RootNode == nullptr)
            {
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("获取根节点失败啦"));
    
                const FString XmlRootNodeContent = "<RootNode>
    </RootNode>";
                m_File = new FXmlFile(XmlRootNodeContent, EConstructMethod::ConstructFromBuffer);
    
                if (m_File == nullptr)
                {
                    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("创建Xml文件失败啦"));
                    loadFileSuccess = false;
                }
                else
                {
                    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("创建Xml文件成功啦"));
                    m_RootNode = m_File->GetRootNode();
    
                    if (NodeCount == 0)
                    {
                        GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("没有创建默认Xml节点"));
                        loadFileSuccess = true;
                    }
                    va_list arg_ptr;
                    va_start(arg_ptr, NodeCount);
    
                    for (int i = 0; i < NodeCount; i++)
                    {
                        auto node = va_arg(arg_ptr, NodeStruct);
                        SetNode(node.tag, node.content);
                    }
                    va_end(arg_ptr);
                    loadFileSuccess = true;
                    this->Save();
                }
    
            }
            else
            {
                loadFileSuccess = true;
                this->Save();
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("打开Xml文件成功啦"));
            }
        }
    }
    
    XmlFileObject::~XmlFileObject()
    {
    }
    
    void XmlFileObject::Save()
    {
        m_File->Save(m_FilePath + m_FileName);
    }
    
    
    bool XmlFileObject::SetNode(const FString &tag, const FString &content)
    {
        FXmlNode* FindNode = m_RootNode->FindChildNode(tag);
    
        if (FindNode == nullptr)
        {
            GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("不存在该Node"));
    
            m_RootNode->AppendChildNode(tag, content);
    
            if (m_RootNode->FindChildNode(tag) == nullptr)
            {
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("创建Node失败"));
                return false;
            }
            else
            {
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("创建Node成功"));
                this->Save();
                return true;
            }
        }
        else
        {
            FindNode->SetContent(content);
            GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("设置Node成功"));
            this->Save();
            return true;
        }
    }
    
    bool XmlFileObject::SetNode(const FString &tag, int content)
    {
        return this->SetNode(tag, FString::FromInt(content));
    }
    
    bool XmlFileObject::SetNode(const FString &tag, float content)
    {
        return this->SetNode(tag, FString::SanitizeFloat(content));
    }
    
    bool XmlFileObject::AddChild(const FString &ParentNodeTag, const FString& ChildNodeTag, const FString &ChildNodeContent)
    {
        auto ParentNode = m_RootNode->FindChildNode(ParentNodeTag);
    
        return this->AddChild(ParentNode, ChildNodeTag, ChildNodeContent);
    }
    
    bool XmlFileObject::AddChild(FXmlNode* ParentNode, const FString& ChildNodeTag, const FString& ChildNodeContent)
    {
        if (ParentNode == nullptr)
        {
            GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("该节点不存在,无法给该节点添加子节点"));
            return false;
        }
        else
        {
            ParentNode->AppendChildNode(ChildNodeTag, ChildNodeContent);
            if (ParentNode->FindChildNode(ChildNodeTag) == nullptr)
            {
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("子节点创建失败"));
                return false;
            }
            else
            {
                GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, TEXT("子节点创建成功"));
                this->Save();
                return true;
            }
        }
    }
    
    FXmlNode* XmlFileObject::GetNode(const FString& tag, const FString &content)
    {
    //     auto FindNodeList = m_RootNode->GetChildrenNodes();
    // 
    //     for (auto node : FindNodeList)
    //     {
    //         if (node->GetContent().Equals(content) && node->GetTag().Equals(tag))
    //         {
    //             return node;
    //         }
    //     }
    //     return nullptr;
    
        return this->GetChildNode(m_RootNode, tag, content);
    }
    
    FXmlNode* XmlFileObject::GetChildNode(FXmlNode* TargetNode, const FString& ChildTag, const FString& ChildContent)
    {
        auto FindNodeList = TargetNode->GetChildrenNodes();
    
        for (auto node : FindNodeList)
        {
            if (node->GetContent().Equals(ChildContent) && node->GetTag().Equals(ChildTag))
            {
                return node;
            }
        }
        return nullptr;
    }
    
    FXmlNode* XmlFileObject::GetChildNode(FXmlNode* TargetNode, const FString& ChildTag)
    {
        auto FindNodeList = TargetNode->GetChildrenNodes();
    
        for (auto node : FindNodeList)
        {
            if (node->GetTag().Equals(ChildTag))
            {
                return node;
            }
        }
        return nullptr;
    }
    
    const TCHAR* XmlFileObject::GetChildNodeContent(FXmlNode* TargetNode, const FString& ChildTag)
    {
        const TCHAR* result = *(GetChildNode(TargetNode, ChildTag)->GetContent());
        return result;
    }
    
    const TCHAR* XmlFileObject::GetNodeContent(const FString &tag)
    {
        FXmlNode* findNode = m_RootNode->FindChildNode(tag);
        if (findNode == nullptr)
        {
            GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("查找该Node失败"));
            //错误代码2222
            const TCHAR* tempChar = *FString("2222");
            return tempChar;
        }
        else
        {
            const TCHAR* tempChar = *(findNode->GetContent());
            return tempChar;
        }
    }
    xmlobject.cpp
  • 相关阅读:
    急招.NET系列职位
    程序员成长的三个方法
    xwebkitspeech
    张小龙的产品
    浅析商业银行“业务连续性管理体系”的构建
    Sonar for dotNet
    Moles测试Contrustor时候遇到的一个问题
    EntityFramework 用Moles的mock
    Accessor中Generic的元素是internal/private的会导致转换失败的异常
    Android自用Intent 介绍
  • 原文地址:https://www.cnblogs.com/litmin/p/7447398.html
Copyright © 2020-2023  润新知