网站建设公司好哪家好,定西市小企业网站建设,北京网络营销推广公司,搜索引擎优化的重要性使用tinyxml2#xff0c;得知道一些xml基础
xml tutorial--菜鸟 tinyxml2类对象
链接
结构 XMLNode
什么是节点
节点#xff1a;元素、声明、文本、注释等。 XMLDocument
xml文档(文件)对象。
作用#xff1a;
加载xml文件#xff0c; tinyxml2作用
先定义两个宏 …使用tinyxml2得知道一些xml基础
xml tutorial--菜鸟 tinyxml2类对象
链接
结构 XMLNode
什么是节点
节点元素、声明、文本、注释等。 XMLDocument
xml文档(文件)对象。
作用
加载xml文件 tinyxml2作用
先定义两个宏
#ifndef XMLCheckResultDocu#define XMLCheckResultDocu(eResult,object) if (eResult ! XML_SUCCESS) { printf(Error: %s\n, object-ErrorStr()); return eResult; }
#endif
#ifndef XMLCheckResult#define XMLCheckResult(eResult) if (eResult ! XML_SUCCESS) { printf(Error: %i\n, eResult); return eResult; }
#endif
1extract xml文件内容
提取一个元素所有属性
if(node-ToElement()) {auto element dynamic_castXMLElement*(node);cout XML 元素name element-Name() , value element-Value() endl;const XMLAttribute* attribute element-FirstAttribute();while (attribute ! nullptr) {cout \t属性 attribute-Name() attribute-Value() endl;attribute attribute-Next();}}
元素的name和value是什么
元素的名称Name指的是元素的标签名例如 book 元素的名称为 book。
元素的值Value指的是元素包含的文本内容也称为元素的数据Data。在 XML 中元素的值位于开始标记和结束标记之间例如 bookXML Basics/book 中的值为 XML Basics。
需要注意的是元素的值和元素的属性并不是同一概念。元素的属性是位于元素开始标记中的信息用于描述元素的附加属性和特征。元素的值则是位于元素开始标记和结束标记之间的文本内容描述了元素的数据内容。
提取一个节点的所有子节点和兄弟节点
void traversingXML(XMLNode* node) {printf(node-Value());if(node-NoChildren()) return;XMLNode* child node-FirstChild();while(child ! nullptr) {traversingXML(child);child child-NextSibling();}
}获取xml文档的第一个节点
注意第一个节点不一定是element的根节点可能是declaration或者其他类型。
在 XML 中根节点root node是整个 XML 文档的最上层节点所有其他节点都是根节点的子节点或后代节点。
根节点是 XML 文档中唯一一个没有父节点的节点。它通常是整个 XML 文档的第一个节点也是唯一一个与 XML 文档的命名空间相关的节点。在 XML 中根节点与 XML 文档的首行XML 声明一起构成了完整的 XML 文档头部信息。
点一个 XML 文件只有一个根节点所有其他节点都是根节点的子节点或者子节点的子节等。根节点的格式如下所示
xml ?xml version1.0 encodingUTF-8? root !-- other nodes... -- /root
在示例中root 是根节点。根节点可以包含其他节点例如元素节点、注释节点、文本节点等。在 XML 解析和处理时可以通过访问根节点来遍历整个 XML 文档并处理其中的数据内容。
XMLNode * pRoot xmlDoc.FirstChild();
if (pRoot nullptr) return XML_ERROR_FILE_READ_ERROR; 获取根元素
XMLElement* getRootElement(XMLNode* node){if(nodenullptr){std::coutcan not get root element,node is empty.std::endl;return nullptr;}XMLNode *childnode;while(child){if(child-ToElement()!nullptr) return (child-ToElement());childchild-NextSibling();}return nullptr;
} Query查询元素指定类型的text并且获取
QueryXXXText()
int iOutInt;
eResult pElement-QueryIntText(iOutInt);
XMLCheckResult(eResult);
如果text不能convert为指定的类型机会返回失败。
Query查询元素指定类型的属性并提取
int iOutDay, iOutYear;eResult pElement-QueryIntAttribute(day, iOutDay);
XMLCheckResult(eResult);eResult pElement-QueryIntAttribute(year, iOutYear);
XMLCheckResult(eResult); 2创建xml文件内容
链接
案例
#include iostream
#include tinyxml2/tinyxml2.husing namespace tinyxml2;void createXML(){XMLDocument document;XMLDeclaration* declarationdocument.NewDeclaration(xml version1.0 encodingUTF-8);XMLComment* commentdocument.NewComment(This is a comment);XMLUnknown* unknowndocument.NewUnknown(unknown type);XMLElement* persondocument.NewElement(person);person-SetAttribute(name,laowang);person-SetAttribute(age,22);person-SetAttribute(gender,man);XMLElement* addrdocument.NewElement(address);addr-SetAttribute(name,guangnan);addr-SetAttribute(postion,sourthwest);XMLElement* enterprisedocument.NewElement(enterprise);enterprise-SetAttribute(first,stuudent);enterprise-SetAttribute(second,xiaobai);enterprise-SetAttribute(third,peitian);XMLElement* successdocument.NewElement(success);success-SetAttribute(stage,highest);XMLText* textdocument.NewText(baby to you);success-InsertEndChild(text);enterprise-InsertEndChild(success);person-InsertEndChild(addr);person-InsertEndChild(enterprise);document.InsertEndChild(declaration);document.InsertEndChild(comment);document.InsertEndChild(unknown);document.InsertEndChild(person);document.SaveFile(person.xml);
}int main(){createXML();return 0;
}
生成的xml文件 函数
外网链接
链接1
链接2
链接3
new类型的函数
比如newElement() XMLNode * InsertFirstChild(XMLNode *addThis) XMLNode * InsertAfterChild(XMLNode *afterThis, XMLNode *addThis) XMLNode * InsertEndChild(XMLNode *addThis) void DeleteChild(XMLNode *node) void DeleteChildren() SetText()
重载函数参数类型可以多种。
设置text的。
所以说一个元素的text可以建立XMLText对象然后insert;也可以用这个函数直接生成。
SetValue()
设置元素名称
element的函数
Attribute()获取指定名称的属性值 - FindAttribute()查找指定名称的属性 - FirstAttribute()获取第一个属性 element对text的处理函数
XMLElement中name,value,text的区别
name和value返回的都是元素的nameGetText返回的才是元素的text.
Value():
void printElementAllInfo(XMLElement* rootElement,int level){if(rootElementnullptr) return;int lelevel;while(le--) std::cout ;std::coutelement name:rootElement-Name();// if(rootElement-GetText()){// std::couttext data:rootElement-GetText();// }if(rootElement-Value()){std::cout text data:rootElement-Value();}std::coutstd::endl;lelevel;while(le--) std::cout ;std::coutrootElement-Name() attribute:std::endl;const XMLAttribute* attirbuterootElement-FirstAttribute();while(attirbute){lelevel;while(le--) std::cout ;std::coutattirbute-Name()attirbute-Value()std::endl;attirbuteattirbute-Next();}//print child element of his elementprintElementAllInfo(rootElement-FirstChildElement(),level1);//print sibling element of this elementprintElementAllInfo(rootElement-NextSiblingElement(),level);
} GetText():
void printElementAllInfo(XMLElement* rootElement,int level){if(rootElementnullptr) return;int lelevel;while(le--) std::cout ;std::coutelement name:rootElement-Name();if(rootElement-GetText()){std::couttext data:rootElement-GetText();}std::coutstd::endl;lelevel;while(le--) std::cout ;std::coutrootElement-Name() attribute:std::endl;const XMLAttribute* attirbuterootElement-FirstAttribute();while(attirbute){lelevel;while(le--) std::cout ;std::coutattirbute-Name()attirbute-Value()std::endl;attirbuteattirbute-Next();}//print child element of his elementprintElementAllInfo(rootElement-FirstChildElement(),level1);//print sibling element of this elementprintElementAllInfo(rootElement-NextSiblingElement(),level);
} 判断element中有没有text
通过GetText的返回值。
获取text----GetText()
注意GetText返回指针而且text不一定存在所以一定要对GetText的返回值进行判断。 获取element的下一个兄弟element
rootElement-NextSiblingElement()
获取元素的子元素---firstChildElement()
获取第一个子元素
XMLElement * pElement pRoot-FirstChildElement();//不使用参数默认获取第一个子元素
if (pElement nullptr) return XML_ERROR_PARSING_ELEMENT; 使用元素名称获取元素的指定子元素
XMLElement * pElement pRoot-FirstChildElement(IntValue);
if (pElement nullptr) return XML_ERROR_PARSING_ELEMENT;
确保子元素名不同。
attribute的函数
提取属于同一个元素的当前属性的下一个属性---Next() XMLNode的函数
企图当前节点的下一个兄弟节点---NextSibling()
XMLElement* getRootElement(XMLNode* node){if(nodenullptr){std::coutcan not get root element,node is empty.std::endl;return nullptr;}XMLNode *childnode;while(child){if(child-ToElement()!nullptr) return (child-ToElement());childchild-NextSibling();}return nullptr;
}
element因为继承这个所以有
1NextSibling()----注意这个获取的不一定是element
2NextSiblingElement()
firstChild()--提取一个节点
注意firstChild提取的不一定是element因为这个函数提取的是节点而不是元素。
element因为继承XMLNode,所以有
1firstChild()---注意这个获取的不一定是element
2firstChildElement()
tinyxml2错误枚举
文件读取错误
if (pRoot nullptr) return XML_ERROR_FILE_READ_ERROR;
元素解析错误
XMLElement * pElement pRoot-FirstChildElement(IntValue);
if (pElement nullptr) return XML_ERROR_PARSING_ELEMENT;
属性解析错误
szAttributeText pElement-Attribute(month);
if (szAttributeText nullptr) return XML_ERROR_PARSING_ATTRIBUTE;
std::string strOutMonth szAttributeText;
XMLError
enum XMLError {XML_SUCCESS 0,XML_NO_ATTRIBUTE,XML_WRONG_ATTRIBUTE_TYPE,XML_ERROR_FILE_NOT_FOUND,XML_ERROR_FILE_COULD_NOT_BE_OPENED,XML_ERROR_FILE_READ_ERROR,XML_ERROR_PARSING_ELEMENT,XML_ERROR_PARSING_ATTRIBUTE,XML_ERROR_PARSING_TEXT,XML_ERROR_PARSING_CDATA,XML_ERROR_PARSING_COMMENT,XML_ERROR_PARSING_DECLARATION,XML_ERROR_PARSING_UNKNOWN,XML_ERROR_EMPTY_DOCUMENT,XML_ERROR_MISMATCHED_ELEMENT,XML_ERROR_PARSING,XML_CAN_NOT_CONVERT_TEXT,XML_NO_TEXT_NODE,XML_ELEMENT_DEPTH_EXCEEDED,XML_ERROR_COUNT
};
ErrorStr()
当发生错误时可以直接使用节点对象的ErrorStr()成员函数输出XMLError的错误类型。
注意这个函数只有document对象才有其他类型的节点没有。
#ifndef XMLCheckResultDocu#define XMLCheckResultDocu(eResult,object) if (eResult ! XML_SUCCESS) { printf(Error: %s\n, object-ErrorStr()); return eResult; }
#endif
#ifndef XMLCheckResult#define XMLCheckResult(eResult) if (eResult ! XML_SUCCESS) { printf(Error: %i\n, eResult); return eResult; }
#endif