Есть не валидный html со списками:
<html>
<ul>
<li>Index</li>
<li>Power</li>
<li>Skill</li>
</ul>
<ul>
<li>Main</li>
</ul>
</html>
Нужно сделать xml вида:
<base>
<list name="Index">
<other id="1">Power</other>
<other id="2">Skill</other>
</list>
<list name="Main">
</list>
</base>
Код на c++:
xmlNode *root = NULL;
root = xmlDocGetRootElement(doc);
root = root->xmlChildrenNode;
printf("<base>");
for(mainnode = root->children; mainnode != NULL; mainnode = mainnode->next){
if (xmlStrcmp(mainnode->name, (const xmlChar *) "ul") == 0) {
iterator_count =0;
for (subnode = mainnode->children; subnode != NULL;subnode=subnode->next){
if(xmlStrcmp(subnode->name, (const xmlChar *) "li") == 0) {
if (iterator_count == 0) {
li = xmlNodeGetContent(child_node);
printf("<list name=\"%s\">", li);
}
else{
li = xmlNodeGetContent(child_node);
printf("<other id=\"1\">%s</value>", li);
}
iterator_count++;
}
}
}
}
printf("</base>");
Проблема поставить закрывающий тег </list>
:
Получается бывает вот так:
<base>
<list name="Index"></list>
<other id="1">Power</other>
<other id="2">Skill</other>
<list name="Main">
</list>
</base>
Т.к. Ваш html представляет собой корректный xml, то для его преобразования в другой xml можно воспользоваться XSL-преобразованием
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/html">
<!-- Обрабатываем корневой элемент -->
<base>
<xsl:apply-templates select="*"/>
</base>
</xsl:template>
<xsl:template match="ul">
<!-- Обрабатываем все списки -->
<list>
<xsl:apply-templates select="*"/>
</list>
</xsl:template>
<xsl:template match="li">
<xsl:choose>
<xsl:when test="position() = 1">
<!-- Если элемент первый, то добавляем к родителю атрибут "name" -->
<xsl:attribute name="name">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<!-- в противном случае, выводим сам элемент -->
<other id="{position() - 1}">
<xsl:value-of select="."/>
</other>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*">
<!-- Для остальных элементов рекурсивно вызываем шаблон -->
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
Виртуальный выделенный сервер (VDS) становится отличным выбором
Доброго времени суток! Недавно начал изучать angularjs и не могу понять как сделать кастомный фильтр Имеется вот такая разметка, которая выводит...
Как вставить видео на сайт так, чтобы при загрузке страницы пользователю не приходилось ждать по 2-3 минуты, чтобы оно загрузилосьвидео хочется...
Помогите решить проблему с подключение к удаленному серверу MySQL при попытке подключения выдает ошибку
Есть таблица Offers с полями price и pointsПредположим есть 10 offers нужно из них посчитать по нарастанию первые 3 у которых наименьшая цена и наибольшее...