Veteran Member
|
07-28-2010
, 09:26
Re: [EXTENSION] TinyXml Wrapper (alpha)
|
#2
|
Some examples.
Creating a XML file
PHP Code:
#pragma semicolon 1 #include <sourcemod> #include <tinyxml>
public OnPluginStart() { CreateTestXML(); }
stock CreateTestXML() { //Create XML Document new Handle:hTxDoc = TinyXml_CreateDocument();
//Create and add declaration new Handle:hTxDecl = TinyXml_CreateDeclaration("1.0","",""); TinyXml_LinkEndChild(hTxDoc, hTxDecl);
//Create element with value "Hello" new Handle:hTxEle = TinyXml_CreateElement("Hello");
//Create comment and add it to the element new Handle:hTxCmt = TinyXml_CreateComment("This is a comment"); TinyXml_LinkEndChild(hTxEle, hTxCmt);
//Create element, give it some text and add it to the element new Handle:hTxEleSub = TinyXml_CreateElement("Sublevel"); new Handle:hTxText = TinyXml_CreateText("HEEEEEEEEELO WORLD"); TinyXml_LinkEndChild(hTxEleSub, hTxText); TinyXml_LinkEndChild(hTxEle, hTxEleSub);
//Add element to the document TinyXml_LinkEndChild(hTxDoc, hTxEle);
//Save the document to a file TinyXml_SaveFile(hTxDoc, "./helloworld.xml");
CloseHandle(hTxText); CloseHandle(hTxEleSub); CloseHandle(hTxCmt); CloseHandle(hTxEle); CloseHandle(hTxDecl); CloseHandle(hTxDoc); }
results in:
Code:
<?xml version="1.0" ?>
<Hello>
<!--This is a comment-->
<Sublevel>HEEEEEEEEELO WORLD</Sublevel>
</Hello>
Reading a RSS file
PHP Code:
#pragma semicolon 1 #include <sourcemod> #include <tinyxml>
public OnPluginStart() { ReadTestRSS(); }
stock ReadTestRSS() { //Create new document and fill it from a file new Handle:hDoc = TinyXml_CreateDocument(); TinyXml_LoadFile(hDoc, "./rss.xml");
//Get the <root> element new Handle:hRoot = TinyXml_RootElement(hDoc);
//Todo: check rss version and read the xml accordingly // for this example we just do atom feeds (rss 2.0)
//Get the <channel> element new Handle:hChannel = TinyXml_FirstChildElement(hRoot);
//Get the first child <item> element new Handle:hNode = TinyXml_FirstChildElement(hChannel, "item");
//Iterate over each <item> element while(hNode != INVALID_HANDLE) { ExtractItem(hNode); hNode = TinyXml_NextSiblingElement(hNode, "item"); }
CloseHandle(hNode); CloseHandle(hChannel); CloseHandle(hRoot); CloseHandle(hDoc); }
stock ExtractItem(Handle:hItem) { new String:sBufferK[2048]; new String:sBufferV[2048];
new Handle:hNode = TinyXml_FirstChildElement(hItem);
while(hNode != INVALID_HANDLE) { TinyXml_Value(hNode, sBufferK, sizeof(sBufferK));
if(StrEqual(sBufferK,"title")) { TinyXml_GetText(hNode, sBufferV, sizeof(sBufferV)); LogMessage("Title: %s (%i)", sBufferV, TinyXml_Type(hNode)); }
if(StrEqual(sBufferK,"description")) { TinyXml_GetText(hNode, sBufferV, sizeof(sBufferV)); LogMessage("Desc: %s", sBufferV); }
if(StrEqual(sBufferK,"link")) { TinyXml_GetText(hNode, sBufferV, sizeof(sBufferV)); LogMessage("Link: %s", sBufferV); }
hNode = TinyXml_NextSiblingElement(hNode); }
CloseHandle(hNode); }
Dumping a xml file recursively
PHP Code:
#pragma semicolon 1 #include <sourcemod> #include <tinyxml>
public OnPluginStart() { new Handle:hTxDoc = TinyXml_CreateDocument(); TinyXml_LoadFile(hTxDoc, "./example4.xml");
RecursiveDump(hTxDoc); CloseHandle(hTxDoc); }
stock RecursiveDump(Handle:hNode, level = 0) { new String:padding[32]; for(new i = 0; i < level; i++) { StrCat(padding, sizeof(padding), " "); }
while(hNode != INVALID_HANDLE) { new NodeType:iType = NodeType:TinyXml_Type(hNode); new String:sType[16]; TypeToString(iType, sType, sizeof(sType));
new String:sValue[64];
if(iType == TINYXML_ELEMENT) { TinyXml_Value(hNode, sValue, sizeof(sValue)); LogMessage("%s%s: %s", padding, sType, sValue); DumpAttributes(hNode, level+1); new Handle:firstChild = TinyXml_FirstChild(hNode); RecursiveDump(firstChild, level+1); CloseHandle(firstChild); }
if(iType == TINYXML_TEXT) { TinyXml_Value(hNode, sValue, sizeof(sValue)); LogMessage("%s%s: %s", padding, sType, sValue); }
if(iType == TINYXML_DOCUMENT) { new Handle:root = TinyXml_RootElement(hNode); RecursiveDump(root); CloseHandle(root); }
if(iType == TINYXML_COMMENT) { TinyXml_Value(hNode, sValue, sizeof(sValue)); LogMessage("%s%s: %s", padding, sType, sValue); }
hNode = TinyXml_NextSibling(hNode); }
CloseHandle(hNode); }
stock DumpAttributes(Handle:hElement, level = 0) { new String:padding[32]; for(new i = 0; i < level; i++) { StrCat(padding, sizeof(padding), " "); }
new Handle:hAttribute = TinyXml_FirstAttribute(hElement);
while(hAttribute != INVALID_HANDLE) { new String:sName[64]; new String:sValue[64];
TinyXml_AttributeName(hAttribute, sName, sizeof(sName)); TinyXml_AttributeValue(hAttribute, sValue, sizeof(sValue));
LogMessage("%s%s: %s", padding, sName, sValue);
hAttribute = TinyXml_NextAttribute(hAttribute); }
CloseHandle(hAttribute); }
stock TypeToString(NodeType:iType, String:buff[], sizebuff) { if(iType == TINYXML_DOCUMENT) strcopy(buff,sizebuff, "Document"); else if(iType == TINYXML_ELEMENT) strcopy(buff,sizebuff, "Element"); else if(iType == TINYXML_COMMENT) strcopy(buff,sizebuff, "Comment"); else if(iType == TINYXML_UNKNOWN) strcopy(buff,sizebuff, "Unknown"); else if(iType == TINYXML_TEXT) strcopy(buff,sizebuff, "Text"); else if(iType == TINYXML_DECLARATION) strcopy(buff,sizebuff, "Declaration"); else if(iType == TINYXML_TYPECOUNT) strcopy(buff,sizebuff, "Typecount"); }
__________________
einmal mit profis arbeiten. einmal.
Last edited by Thrawn2; 08-06-2010 at 17:09.
Reason: Added missing CloseHandle() calls
|
|