Esempio n. 1
0
/**
 * xsltUnparsedEntityURIFunction:
 * @ctxt:  the XPath Parser context
 * @nargs:  the number of arguments
 *
 * Implement the unparsed-entity-uri() XSLT function
 *   string unparsed-entity-uri(string)
 */
void
xsltUnparsedEntityURIFunction(xmlXPathParserContextPtr ctxt, int nargs){
    xmlXPathObjectPtr obj;
    xmlChar *str;

    if ((nargs != 1) || (ctxt->value == NULL)) {
        xsltGenericError(xsltGenericErrorContext,
		"unparsed-entity-uri() : expects one string arg\n");
	ctxt->error = XPATH_INVALID_ARITY;
	return;
    }
    obj = valuePop(ctxt);
    if (obj->type != XPATH_STRING) {
	obj = xmlXPathConvertString(obj);
    }

    str = obj->stringval;
    if (str == NULL) {
	valuePush(ctxt, xmlXPathNewString((const xmlChar *)""));
    } else {
	xmlEntityPtr entity;

	entity = xmlGetDocEntity(ctxt->context->doc, str);
	if (entity == NULL) {
	    valuePush(ctxt, xmlXPathNewString((const xmlChar *)""));
	} else {
	    if (entity->URI != NULL)
		valuePush(ctxt, xmlXPathNewString(entity->URI));
	    else
		valuePush(ctxt, xmlXPathNewString((const xmlChar *)""));
	}
    }
    xmlXPathFreeObject(obj);
}
Esempio n. 2
0
bool gpl::xml::getEntityValue(const std::string& entName, std::map<std::string, std::string>& props)
{
	xmlEntityPtr ent;
	if (m_xml->doc == 0)
		return false;

	std::string str;

	//debug output
	//xmlDebugDumpEntities(stdout,m_xml->doc);
	//end debug
	ent = xmlGetDocEntity(m_xml->doc, (const xmlChar*)entName.c_str());
	if (ent != NULL)
	{
		props.clear();
#ifdef WIN32
		this->ltoa((long)ent->etype, str);
#else
		char buff[100];
		str = ltoa((long)ent->etype, buff, 100);
#endif
		props.insert(std::map<std::string, std::string>::value_type(std::string("ETYPE"), str));

		str = m_xml->getStringByXmlCharPtr((xmlChar*)ent->ExternalID);
		props.insert(std::map<std::string, std::string>::value_type(std::string("ID"), str));

		str = m_xml->getStringByXmlCharPtr((xmlChar*)ent->SystemID);
		props.insert(std::map<std::string, std::string>::value_type(std::string("SYSTEM"), str));

		str = m_xml->getStringByXmlCharPtr((xmlChar*)ent->orig);
		props.insert(std::map<std::string, std::string>::value_type(std::string("ORIG"), str));

		str = m_xml->getStringByXmlCharPtr((xmlChar*)ent->content);
		props.insert(std::map<std::string, std::string>::value_type(std::string("CONTENT"), str));
	}
	else
		return false;
	return true;
}
Esempio n. 3
0
static xmlEntityPtr
_get_entity(void *user, const xmlChar *name)
{
	XML_Parser parser = (XML_Parser) user;
	xmlEntityPtr ret = NULL;

	if (parser->parser->inSubset == 0) {
		ret = xmlGetPredefinedEntity(name);
		if (ret == NULL)
			ret = xmlGetDocEntity(parser->parser->myDoc, name);

		if (ret == NULL || (parser->parser->instate != XML_PARSER_ENTITY_VALUE && parser->parser->instate != XML_PARSER_ATTRIBUTE_VALUE)) {
			if (ret == NULL || ret->etype == XML_INTERNAL_GENERAL_ENTITY || ret->etype == XML_INTERNAL_PARAMETER_ENTITY || ret->etype == XML_INTERNAL_PREDEFINED_ENTITY) {
				/* Predefined entities will expand unless no cdata handler is present */
				if (parser->h_default && ! (ret && ret->etype == XML_INTERNAL_PREDEFINED_ENTITY && parser->h_cdata)) {
					xmlChar *entity;
					int      len;
					
					_build_entity(name, xmlStrlen(name), &entity, &len);
					parser->h_default(parser->user, (const xmlChar *) entity, len);
					xmlFree(entity);
				} else {
					/* expat will not expand internal entities if default handler is present otherwise
					it will expand and pass them to cdata handler */
					if (parser->h_cdata && ret) {
						parser->h_cdata(parser->user, ret->content, xmlStrlen(ret->content));
					}
				}
			} else {
				if (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
					_external_entity_ref_handler(user, ret->name, ret->etype, ret->SystemID, ret->ExternalID, NULL);
				}
			}
		}
	}

	return ret;
}
Esempio n. 4
0
static xmlEntityPtr
xml_process_entities (void *ctxt, const xmlChar *name)
{
	gchar *path;
	xmlEntityPtr entity;
	xmlEntityPtr found;
	xmlChar *tmp;
	static xmlDocPtr entities = NULL;

	entity = xmlGetPredefinedEntity (name);

	if (!entity) {
		if (!entities) {
			/* loading HTML entities from external DTD file */
			entities = xmlNewDoc (BAD_CAST "1.0");
			path = g_build_filename (g_get_user_data_dir (), PACKAGE, "/dtd/html.ent", NULL);
			xmlCreateIntSubset (entities, BAD_CAST "HTML entities", NULL, BAD_CAST path);
			g_free (path);
			entities->extSubset = xmlParseDTD (entities->intSubset->ExternalID, entities->intSubset->SystemID);
		}

		if (NULL != (found = xmlGetDocEntity (entities, name))) {
			/* returning as faked predefined entity... */
			tmp = xmlStrdup (found->content);
			tmp = BAD_CAST unhtmlize ((gchar*) tmp);	/* arghh ... slow... */
			entity = (xmlEntityPtr) g_new0 (xmlEntity, 1);
			entity->type = XML_ENTITY_DECL;
			entity->name = name;
			entity->orig = NULL;
			entity->content = tmp;
			entity->length = g_utf8_strlen ((gchar*) tmp, -1);
			entity->etype = XML_INTERNAL_PREDEFINED_ENTITY;
		}
	}

	return entity;
}
Esempio n. 5
0
/*Modified libxml code to avoid truncating text of child elements*/
static xmlChar *
MyxmlNodeGetContent(xmlNodePtr cur) {
    if (cur == NULL) return(NULL);
    switch (cur->type) {
	case XML_DOCUMENT_FRAG_NODE:
	case XML_ELEMENT_NODE: {
		xmlNodePtr tmp = cur;
		xmlBufferPtr buffer;
		xmlChar *ret;
		
		buffer = xmlBufferCreate();
		if (buffer == NULL)
			return(NULL);
		while (tmp != NULL) {
			switch (tmp->type) {
			case XML_CDATA_SECTION_NODE:
			case XML_TEXT_NODE:
				if (tmp->content != NULL)
#ifndef XML_USE_BUFFER_CONTENT
					xmlBufferCat(buffer, tmp->content);
#else
				xmlBufferCat(buffer,
					xmlBufferContent(tmp->content));
#endif
				break;
			case XML_ENTITY_REF_NODE: {
				xmlEntityPtr ent;
				
				ent = xmlGetDocEntity(cur->doc, tmp->name);
				if (ent != NULL)
					xmlBufferCat(buffer, ent->content);
									  }
			default:
				break;
			}
			/*
			* Skip to next node
			*/
			if (tmp->children != NULL) {
				if (tmp->children->type != XML_ENTITY_DECL && tmp->children->type != XML_ELEMENT_NODE) {
					tmp = tmp->children;
					continue;
				}
			}
			
			if (tmp == cur)
				break;
			
			if (tmp->next != NULL) {
				tmp = tmp->next;
				continue;
			}
			
			do {
				tmp = tmp->parent;
				if (tmp == NULL)
					break;
				if (tmp == cur) {
					tmp = NULL;
					break;
				}
				if (tmp->next != NULL) {
					tmp = tmp->next;
					break;
				}
			} while (tmp != NULL);
		}
		ret = buffer->content;
		buffer->content = NULL;
		xmlBufferFree(buffer);
		return(ret);
						   }
	case XML_ATTRIBUTE_NODE: {
		xmlAttrPtr attr = (xmlAttrPtr) cur;
		if (attr->parent != NULL)
			return(xmlNodeListGetString(attr->parent->doc, attr->children, 1));
		else
			return(xmlNodeListGetString(NULL, attr->children, 1));
		break;
							 }
	case XML_COMMENT_NODE:
	case XML_PI_NODE:
		if (cur->content != NULL)
#ifndef XML_USE_BUFFER_CONTENT
			return(xmlStrdup(cur->content));
#else
		return(xmlStrdup(xmlBufferContent(cur->content)));
#endif
		return(NULL);
	case XML_ENTITY_REF_NODE:
	/*
	* Locate the entity, and get it's content
	* @@@
		*/
		return(NULL);
	case XML_ENTITY_NODE:
	case XML_DOCUMENT_NODE:
	case XML_HTML_DOCUMENT_NODE:
	case XML_DOCUMENT_TYPE_NODE:
	case XML_NOTATION_NODE:
	case XML_DTD_NODE:
	case XML_XINCLUDE_START:
	case XML_XINCLUDE_END:
#ifdef LIBXML_DOCB_ENABLED
	case XML_DOCB_DOCUMENT_NODE:
#endif
		return(NULL);
	case XML_NAMESPACE_DECL:
		return(xmlStrdup(((xmlNsPtr)cur)->href));
	case XML_ELEMENT_DECL:
		/* UNIMPLEMENTED */
		return(NULL);
	case XML_ATTRIBUTE_DECL:
		/* UNIMPLEMENTED */
		return(NULL);
	case XML_ENTITY_DECL:
		/* UNIMPLEMENTED */
		return(NULL);
	case XML_CDATA_SECTION_NODE:
	case XML_TEXT_NODE:
		if (cur->content != NULL)
#ifndef XML_USE_BUFFER_CONTENT
			return(xmlStrdup(cur->content));
#else
		return(xmlStrdup(xmlBufferContent(cur->content)));
#endif
		return(NULL);
    }
    return(NULL);
}
Esempio n. 6
0
/**
*dump一个节点到结果集
*@param nodePtr 当前的节点指针
*@param resultSet 返回的结果集,参见XmlApi::getXPathResultSet(multimap<string,string>& resultSet)方法的说明
*@return 成功返回true,否则返回false;
*/
bool gpl::xml::LibXml::getDumpNode(xmlNodePtr nodePtr, std::multimap<std::string, std::string>&resultSet)
{
	if (nodePtr == NULL)
		return false;

	std::string name, value;
	switch (nodePtr->type)
	{
	case XML_ELEMENT_NODE:
		name = getStringByXmlCharPtr((xmlChar *)nodePtr->name);
		value = getStringByXmlCharPtr(xmlNodeListGetString(doc, nodePtr->xmlChildrenNode, 1), 1);
		resultSet.insert(std::multimap<std::string, std::string>::value_type(name, value));
		break;
	case XML_TEXT_NODE:
	case XML_CDATA_SECTION_NODE:
		name = getStringByXmlCharPtr((xmlChar *)nodePtr->name);
		value = "";
		if (nodePtr->content != NULL)
		{
			if (isOnlyEntityName)
				value = getStringByXmlCharPtr(nodePtr->content);
			else
			{
				xmlChar *buffer;
				buffer = xmlEncodeEntitiesReentrant(doc, nodePtr->content);
				if (buffer != NULL)
				{
					value = getStringByXmlCharPtr(buffer, 1);
				}
			}
		}
		resultSet.insert(std::multimap<std::string, std::string>::value_type(name, value));
		break;
	case XML_PI_NODE:
	case XML_COMMENT_NODE:
		name = getStringByXmlCharPtr((xmlChar *)nodePtr->name);
		if (nodePtr->content != NULL)
		{
			value = getStringByXmlCharPtr(nodePtr->content);
		}
		resultSet.insert(std::multimap<std::string, std::string>::value_type(name, value));
		break;
	case XML_DOCUMENT_NODE:
	case XML_HTML_DOCUMENT_NODE:
		resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("document or html_document"), std::string("/")));
		break;
	case XML_ATTRIBUTE_NODE:
		return getDumpAttribute(reinterpret_cast<xmlAttrPtr>(nodePtr), resultSet);
	case XML_ENTITY_REF_NODE:
		name = getStringByXmlCharPtr((xmlChar *)nodePtr->name);
		value = "";
		if (nodePtr->content != NULL)
		{
			if (isOnlyEntityName)
			{
				//value = getStringByXmlCharPtr(nodePtr->content);
				xmlEntityPtr ent = xmlGetDocEntity(doc, nodePtr->name);
				if (ent != NULL)
				{
					xmlChar *buffer;

					/* an entity content can be any "well balanced chunk",
					* i.e. the result of the content [43] production:
					* http://www.w3.org/TR/REC-xml#NT-content.
					* So it can contain text, CDATA section or nested
					* entity reference nodes (among others).
					* -> we recursive  call xmlNodeListGetString()
					* which handles these types */
					buffer = xmlNodeListGetString(doc, ent->children, 1);
					if (buffer != NULL)
					{
						value = getStringByXmlCharPtr(buffer, 1);
					}
				}
				else
				{
					value = getStringByXmlCharPtr(nodePtr->content);
				}
				}
			else
			{
				value = "&" + getStringByXmlCharPtr((xmlChar*)nodePtr->name) + ";";
			}
			}
		resultSet.insert(std::multimap<std::string, std::string>::value_type(name, value));
		break;
	default:
		;
		}
	return true;
	}
Esempio n. 7
0
void xmlDebugDumpNode(FILE *output, xmlNodePtr node, int depth) {
    int i;
    char shift[100];

    for (i = 0;((i < depth) && (i < 25));i++)
        shift[2 * i] = shift[2 * i + 1] = ' ';
    shift[2 * i] = shift[2 * i + 1] = 0;

    fprintf(output, shift);
    switch (node->type) {
	case XML_ELEMENT_NODE:
	    fprintf(output, "ELEMENT ");
	    if (node->ns != NULL)
	        fprintf(output, "%s:%s\n", node->ns->prefix, node->name);
	    else
	        fprintf(output, "%s\n", node->name);
	    break;
	case XML_ATTRIBUTE_NODE:
	    fprintf(output, "Error, ATTRIBUTE found here\n");
	    break;
	case XML_TEXT_NODE:
	    fprintf(output, "TEXT\n");
	    break;
	case XML_CDATA_SECTION_NODE:
	    fprintf(output, "CDATA_SECTION\n");
	    break;
	case XML_ENTITY_REF_NODE:
	    fprintf(output, "ENTITY_REF\n");
	    break;
	case XML_ENTITY_NODE:
	    fprintf(output, "ENTITY\n");
	    break;
	case XML_PI_NODE:
	    fprintf(output, "PI\n");
	    break;
	case XML_COMMENT_NODE:
	    fprintf(output, "COMMENT\n");
	    break;
	case XML_DOCUMENT_NODE:
	    fprintf(output, "Error, DOCUMENT found here\n");
	    break;
	case XML_DOCUMENT_TYPE_NODE:
	    fprintf(output, "DOCUMENT_TYPE\n");
	    break;
	case XML_DOCUMENT_FRAG_NODE:
	    fprintf(output, "DOCUMENT_FRAG\n");
	    break;
	case XML_NOTATION_NODE:
	    fprintf(output, "NOTATION\n");
	    break;
	default:
	    fprintf(output, "NODE_%d\n", node->type);
    }
    if (node->doc == NULL) {
        fprintf(output, shift);
	fprintf(output, "doc == NULL !!!\n");
    }
    if (node->nsDef != NULL) 
        xmlDebugDumpNamespaceList(output, node->nsDef, depth + 1);
    if (node->properties != NULL)
	xmlDebugDumpAttrList(output, node->properties, depth + 1);
    if (node->type != XML_ENTITY_REF_NODE) {
	if (node->content != NULL) {
	    fprintf(output, shift);
	    fprintf(output, "content=");
	    xmlDebugDumpString(output, node->content);
	    fprintf(output, "\n");
	}
    } else {
        xmlEntityPtr ent;
	ent = xmlGetDocEntity(node->doc, node->name);
	if (ent != NULL)
	    xmlDebugDumpEntity(output, ent, depth + 1);
    }
    if (node->childs != NULL)
	xmlDebugDumpNodeList(output, node->childs, depth + 1);
}
Esempio n. 8
0
xmlEntityPtr Document::NamedEntity(const string &name) const
{
    return xmlGetDocEntity(const_cast<xmlDocPtr>(xml()), name.utf8());
}