blob: 9f3f84ad364e1905ce13dd4e1f7dddd780966d60 [file] [log] [blame]
/*
* 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.
*
* CREATED: 2011-06-01
* UPDATED: 2011-07-27
*/
#include "XmlElement.h"
#include <libxml/tree.h>
#include <stdlib.h>
#include <sstream>
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;
}
uint32_t CXmlElement::getNbChildElements() const
{
CXmlElement childElement;
uint32_t uiNbChildren = 0;
CChildIterator childIterator(*this);
while (childIterator.next(childElement)) {
uiNbChildren++;
}
return uiNbChildren;
}
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::setAttributeBoolean(const string& strAttributeName, bool bValue)
{
setAttributeString(strAttributeName, bValue ? "true" : "false");
}
void CXmlElement::setAttributeString(const string& strAttributeName, const string& strValue)
{
xmlNewProp(_pXmlElement, BAD_CAST strAttributeName.c_str(), BAD_CAST strValue.c_str());
}
void CXmlElement::setAttributeInteger(const string& strAttributeName, uint32_t uiValue)
{
ostringstream strStream;
strStream << uiValue;
setAttributeString(strAttributeName, strStream.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;
}