Как из html создать xml

281
12 декабря 2017, 18:10

Есть не валидный 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>
Answer 1

Т.к. Ваш 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>
READ ALSO
Создание пользовательского фильтра angularjs

Создание пользовательского фильтра angularjs

Доброго времени суток! Недавно начал изучать angularjs и не могу понять как сделать кастомный фильтр Имеется вот такая разметка, которая выводит...

238
Вставить видео на сайт с быстрой загрузкой

Вставить видео на сайт с быстрой загрузкой

Как вставить видео на сайт так, чтобы при загрузке страницы пользователю не приходилось ждать по 2-3 минуты, чтобы оно загрузилосьвидео хочется...

250
Подключение к удаленной базе MySQL через pymysql

Подключение к удаленной базе MySQL через pymysql

Помогите решить проблему с подключение к удаленному серверу MySQL при попытке подключения выдает ошибку

259
Правильный селект в Laravel

Правильный селект в Laravel

Есть таблица Offers с полями price и pointsПредположим есть 10 offers нужно из них посчитать по нарастанию первые 3 у которых наименьшая цена и наибольшее...

277