diff options
Diffstat (limited to 'xmlserializer/XmlElement.cpp')
-rw-r--r-- | xmlserializer/XmlElement.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/xmlserializer/XmlElement.cpp b/xmlserializer/XmlElement.cpp new file mode 100644 index 0000000..cea7a1d --- /dev/null +++ b/xmlserializer/XmlElement.cpp @@ -0,0 +1,235 @@ +/* <auto_header> + * <FILENAME> + * + * INTEL CONFIDENTIAL + * Copyright © 2011 Intel + * Corporation All Rights Reserved. + * + * The source code contained or described herein and all documents related to + * the source code ("Material") are owned by Intel Corporation or its suppliers + * or licensors. Title to the Material remains with Intel Corporation or its + * suppliers and licensors. The Material contains trade secrets and proprietary + * and confidential information of Intel or its suppliers and licensors. The + * Material is protected by worldwide copyright and trade secret laws and + * treaty provisions. No part of the Material may be used, copied, reproduced, + * modified, published, uploaded, posted, transmitted, distributed, or + * disclosed in any way without Intel’s prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by Intel in writing. + * + * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) + * CREATED: 2011-06-01 + * UPDATED: 2011-07-27 + * + * + * </auto_header> + */ +#include "XmlElement.h" +#include <libxml/tree.h> +#include <stdlib.h> + +CXmlElement::CXmlElement(_xmlNode* pXmlElement) : _pXmlElement(pXmlElement) +{ +} + +CXmlElement::CXmlElement() : _pXmlElement(NULL) +{ +} + +void CXmlElement::setXmlElement(_xmlNode* pXmlElement) +{ + _pXmlElement = pXmlElement; +} + +string CXmlElement::getType() const +{ + return (const char*)_pXmlElement->name; +} + +string CXmlElement::getPath() const +{ + string strPathElement = "/" + getType(); + + if (hasAttribute("Name")) { + + strPathElement += "[@Name=" + getNameAttribute() + "]"; + } + + CXmlElement parentElement; + + if (getParentElement(parentElement)) { + + // Done + return parentElement.getPath() + strPathElement; + } + return strPathElement; +} + +string CXmlElement::getNameAttribute() const +{ + return getAttributeString("Name"); +} + +bool CXmlElement::hasAttribute(const string& strAttributeName) const +{ + return xmlHasProp(_pXmlElement, (const xmlChar*)strAttributeName.c_str()) != NULL; +} + +string CXmlElement::getAttributeString(const string &strAttributeName) const +{ + if (!hasAttribute(strAttributeName)) { + + return ""; + } + xmlChar* pucXmlValue = xmlGetProp((xmlNode*)_pXmlElement, (const xmlChar*)strAttributeName.c_str()); + + string strValue((const char*)pucXmlValue); + + xmlFree(pucXmlValue); + + return strValue; +} + +bool CXmlElement::getAttributeBoolean(const string& strAttributeName, const string& strTrueValue) const +{ + return getAttributeString(strAttributeName) == strTrueValue; +} + +bool CXmlElement::getAttributeBoolean(const string& strAttributeName) const +{ + string strAttributeValue(getAttributeString(strAttributeName)); + + return strAttributeValue == "true" || strAttributeValue == "1"; +} + +uint32_t CXmlElement::getAttributeInteger(const string &strAttributeName) const +{ + string strAttributeValue(getAttributeString(strAttributeName)); + + return strtoul(strAttributeValue.c_str(), NULL, 0); +} + +int32_t CXmlElement::getAttributeSignedInteger(const string &strAttributeName) const +{ + string strAttributeValue(getAttributeString(strAttributeName)); + + return strtol(strAttributeValue.c_str(), NULL, 0); +} + +double CXmlElement::getAttributeDouble(const string &strAttributeName) const +{ + string strAttributeValue(getAttributeString(strAttributeName)); + + return strtod(strAttributeValue.c_str(), NULL); +} + +string CXmlElement::getTextContent() const +{ + xmlChar* pucXmlContent = xmlNodeGetContent(_pXmlElement); + + string strContent((const char*)pucXmlContent); + + xmlFree(pucXmlContent); + + return strContent; +} + +bool CXmlElement::getChildElement(const string& strType, CXmlElement& childElement) const +{ + CChildIterator childIterator(*this); + + while (childIterator.next(childElement)) { + + if (childElement.getType() == strType) { + + return true; + } + } + return false; +} + +bool CXmlElement::getChildElement(const string& strType, const string& strNameAttribute, CXmlElement& childElement) const +{ + CChildIterator childIterator(*this); + + while (childIterator.next(childElement)) { + + if ((childElement.getType() == strType) && (childElement.getNameAttribute() == strNameAttribute)) { + + return true; + } + } + return false; +} + +bool CXmlElement::getParentElement(CXmlElement& parentElement) const +{ + _xmlNode* pXmlNode = _pXmlElement->parent; + + if (pXmlNode->type == XML_ELEMENT_NODE) { + + parentElement.setXmlElement(pXmlNode); + + return true; + } + return false; +} + +// Setters +void CXmlElement::setAttributeString(const string& strAttributeName, const string& strValue) +{ + xmlNewProp(_pXmlElement, BAD_CAST strAttributeName.c_str(), BAD_CAST strValue.c_str()); +} + +void CXmlElement::setNameAttribute(const string& strValue) +{ + setAttributeString("Name", strValue); +} + +void CXmlElement::setTextContent(const string& strContent) +{ + xmlAddChild(_pXmlElement, xmlNewText(BAD_CAST strContent.c_str())); +} + +void CXmlElement::setComment(const string& strComment) +{ + xmlAddChild(_pXmlElement, xmlNewComment(BAD_CAST strComment.c_str())); +} + +// Child creation +void CXmlElement::createChild(CXmlElement& childElement, const string& strType) +{ +#ifdef LIBXML_TREE_ENABLED + xmlNodePtr pChildNode = xmlNewChild(_pXmlElement, NULL, BAD_CAST strType.c_str(), NULL); + + childElement.setXmlElement(pChildNode); +#endif +} + +// Child iteration +CXmlElement::CChildIterator::CChildIterator(const CXmlElement& xmlElement) : _pCurNode(xmlElement._pXmlElement->children) +{ +} + +bool CXmlElement::CChildIterator::next(CXmlElement& xmlChildElement) +{ + while (_pCurNode) { + + if (_pCurNode->type == XML_ELEMENT_NODE) { + + xmlChildElement.setXmlElement(_pCurNode); + + _pCurNode = _pCurNode->next; + + return true; + } + _pCurNode = _pCurNode->next; + } + + return false; +} + |