1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "sysman/linux/xml_parser/xml_parser_imp.h"
namespace L0 {
std::vector<XmlNode *> XmlNodeImp::xPath(std::string path) {
std::vector<XmlNode *> nodes;
xmlXPathContextPtr cntx = pXml2Api->xmlXPathNewContext(doc);
if (nullptr != cntx) {
xmlXPathObjectPtr xpathObj = pXml2Api->xmlXPathNodeEval(node, path, cntx);
if (nullptr != xpathObj) {
xmlNodeSetPtr nodeset = xpathObj->nodesetval;
for (int i = 0; i < xmlXPathNodeSetGetLength(nodeset); i++) {
xmlNodePtr node = xmlXPathNodeSetItem(nodeset, i);
if (nullptr == node) {
continue;
}
XmlNodeImp *pXmlNodeImp = new XmlNodeImp(pXml2Api, doc, node);
UNRECOVERABLE_IF(nullptr == pXmlNodeImp);
nodes.push_back(pXmlNodeImp);
}
pXml2Api->xmlXPathFreeObject(xpathObj);
}
pXml2Api->xmlXPathFreeContext(cntx);
}
return nodes;
}
std::string XmlNodeImp::getName() {
return std::string(reinterpret_cast<const char *>(node->name));
}
std::string XmlNodeImp::getPath() {
return pXml2Api->xmlGetNodePath(node);
}
std::string XmlNodeImp::getText() {
return pXml2Api->xmlXPathCastNodeToString(node);
}
std::string XmlNodeImp::getAttribute(std::string attribute) {
return pXml2Api->xmlGetProp(node, attribute);
}
std::vector<XmlNode *> XmlDocImp::xPath(std::string path) {
std::vector<XmlNode *> nodes;
xmlXPathContextPtr cntx = pXml2Api->xmlXPathNewContext(doc);
if (nullptr != cntx) {
xmlXPathObjectPtr xpathObj = pXml2Api->xmlXPathEval(path, cntx);
if (nullptr != xpathObj) {
xmlNodeSetPtr nodeset = xpathObj->nodesetval;
for (int i = 0; i < xmlXPathNodeSetGetLength(nodeset); i++) {
xmlNodePtr node = xmlXPathNodeSetItem(nodeset, i);
if (nullptr == node) {
continue;
}
XmlNodeImp *pXmlNodeImp = new XmlNodeImp(pXml2Api, doc, node);
UNRECOVERABLE_IF(nullptr == pXmlNodeImp);
nodes.push_back(pXmlNodeImp);
}
pXml2Api->xmlXPathFreeObject(xpathObj);
}
pXml2Api->xmlXPathFreeContext(cntx);
}
return nodes;
}
XmlDoc *XmlDocImp::parseFile(Xml2Api *pXml2Api, std::string filename) {
// Don't allow the parser to print errors or warnings. Don't allow network file access.
xmlDocPtr doc = pXml2Api->xmlReadFile(filename, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET);
if (nullptr != doc) {
return new XmlDocImp(pXml2Api, doc);
}
return nullptr;
}
XmlDoc *XmlDocImp::parseBuffer(Xml2Api *pXml2Api, std::string buffer) {
// Don't allow the parser to print errors or warnings. Don't allow network file access.
xmlDocPtr doc = pXml2Api->xmlReadMemory(buffer, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET);
if (nullptr != doc) {
return new XmlDocImp(pXml2Api, doc);
}
return nullptr;
}
XmlDocImp::~XmlDocImp() {
pXml2Api->xmlFreeDoc(doc);
}
XmlDoc *XmlParserImp::parseFile(std::string filename) {
return XmlDocImp::parseFile(pXml2Api, filename);
}
XmlDoc *XmlParserImp::parseBuffer(std::string buffer) {
return XmlDocImp::parseBuffer(pXml2Api, buffer);
}
XmlParserImp::XmlParserImp() {
pXml2Api = Xml2Api::create();
if (nullptr != pXml2Api) {
pXml2Api->xmlInitParser();
}
}
XmlParserImp::~XmlParserImp() {
if (nullptr != pXml2Api) {
pXml2Api->xmlCleanupParser();
delete pXml2Api;
pXml2Api = nullptr;
}
}
XmlParser *XmlParser::create() {
XmlParserImp *pXmlParserImp = new XmlParserImp;
UNRECOVERABLE_IF(nullptr == pXmlParserImp);
if (!pXmlParserImp->isAvailable()) {
delete pXmlParserImp;
pXmlParserImp = nullptr;
}
return pXmlParserImp;
}
} // namespace L0
|