From 78149024ee99ef05b87fa18fc52c7d534e46ec4c Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 4 Jan 2025 14:16:03 +0800 Subject: [PATCH] update TreeXML --- inc/hgl/util/xml/TreeXML.h | 57 ++++++++++++++++++++++++++------------ src/xml/TreeXML.cpp | 50 ++++++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/inc/hgl/util/xml/TreeXML.h b/inc/hgl/util/xml/TreeXML.h index c303745..4a6db64 100644 --- a/inc/hgl/util/xml/TreeXML.h +++ b/inc/hgl/util/xml/TreeXML.h @@ -1,7 +1,10 @@ #pragma once #include +#include #include +#include + namespace hgl { namespace xml @@ -12,35 +15,55 @@ namespace hgl //但由于要一次性保存整个树形结构,所以对内存消耗较大,且必须等到整个XML解晰完才可以访问。 //所以TreeXML仅限于对小型XML文件的解晰,对于大型XML文件,还是使用XMLParse进行流式解晰比较好。 - class TreeXML + struct TreeXMLData { - char *xml_raw_data; ///<整体XML原始数据 - int xml_raw_size; ///<整体XML原始数据长度 - - protected: - using XSVList=List; - protected: + public: + + U8StringView xml_raw_data; /// + abcdefg + + + element_name root + atts atts=info + data abcdefg + */ + + TreeXMLData * xml_raw_data; + + int element_name; ///<元素点名字视图 + List> atts; ///<属性点文字视图 + int data; ///<数据文本视图 + + private: + + TreeXMLNode(TreeXMLData *,int); + + void AddAtts(int,int); + void SetData(int); public: - class Node - { - U8StringView element_name; ///<元素点名字视图 - U8StringView atts; ///<属性点文字视图 - }; + const U8StringView *GetElementName()const; + + const U8StringView *GetAtts(const U8String &); + const U8StringView *GetAtts(const U8StringView &); - public: + const U8StringView *GetData()const; + }; - TreeXML(char *,int); - };//class TreeXML - - TreeXML *ParseXMLToTree(char *,int); + TreeXMLNode *ParseXMLToTree(U8StringView); }//namespace xml }//namespace hgl diff --git a/src/xml/TreeXML.cpp b/src/xml/TreeXML.cpp index 56d6e87..61d6682 100644 --- a/src/xml/TreeXML.cpp +++ b/src/xml/TreeXML.cpp @@ -6,10 +6,43 @@ namespace hgl { namespace xml { - TreeXML::TreeXML(char *data,int size) + TreeXMLNode::TreeXMLNode(TreeXMLData *xdata,int name) { - xml_raw_data=data; - xml_raw_size=size; + xml_raw_data=xdata; + element_name=name; + + data=-1; + } + + void TreeXMLNode::AddAtts(int name,int info) + { + atts.Add(Pair(name,info)); + } + + void TreeXMLNode::SetData(int d) + { + data=d; + } + + const U8StringView *TreeXMLNode::GetElementName()const + { + if(!xml_raw_data||element_name<0) + return nullptr; + + return xml_raw_data->ElementNameList.At(element_name); + } + + const U8StringView *TreeXMLNode::GetAtts(const U8String &name) + { + if(!xml_raw_data||atts.IsEmpty()||name.IsEmpty()) + return nullptr; + + for(int i=0;iAttsList[atts[i].left]==name) + return xml_raw_data->InfoList.At(atts[i].right); + } + return nullptr; } namespace @@ -38,13 +71,16 @@ namespace hgl } }//namespace - TreeXML *ParseXMLToTree(char *xml_raw_text,int xml_raw_size) + TreeXMLNode *ParseXMLToTree(U8StringView sv) { - if(!xml_raw_text||xml_raw_size<=0)return(nullptr); + if(sv.IsEmpty()) + return(nullptr); XMLTreeParse xtp; - TreeXML *root=new TreeXML(xml_raw_text,xml_raw_size); + TreeXMLData *xml_data=new TreeXMLData; + + xml_data->xml_raw_data=sv; XML_Parser xml=XML_ParserCreate(XML_UTF8_Charset); @@ -53,7 +89,7 @@ namespace hgl XML_SetElementHandler(xml,(XML_StartElementHandler)TreeXMLStartElement,(XML_EndElementHandler)TreeXMLEndElement); XML_SetCharacterDataHandler(xml,(XML_CharacterDataHandler)TreeXMLCharData); - XML_Parse(xml,xml_raw_text,xml_raw_size,true); + XML_Parse(xml,(char *)sv.c_str(),sv.length(),true); } }//namespace xml }//namespace hgl