现在,我正在尝试创建一个递归函数,该函数采用HTML文档树并仅使用子运算符(>)返回表示格式化CSS的字符串。我会进一步解释,也许您可​​以在遇到困难时帮助我。至少请给我一些提示或想法。

所以想法是从类似

                  body
               /       \
             div        div
            /   \    /   \  \
           h1   p   p    ul  div
                        / \
                       li  li


div
    div > h1
    div > p
    div > p
    div > ul
        div > ul > li
        div > ul > li
    div > div

或者,如果您愿意,
"div\n\t div > h1\n\tdiv > p\n\tdiv > p\n\tdiv > ul\n\t\tdiv > ul > li\n\t\tdiv > ul > li\n\tdiv > div"

我已经有一个获取body和从中生长的树的过程。我需要的3个函数是一个称为XMLNode的对象的成员
  • getChildNode(int k)返回作为子对象XMLNodek对象。如果不存在,则对象返回具有
  • 属性
  • isEmpty()
  • getName()以类似于字符串的对象的形式返回节点的名称,该对象可以转换为字符串。

  • 因此,我尝试编写满足我需要的过程的尝试是调用
    std::cout << tree2CSS(bodyNode);
    

    函数tree2CSS的实现方式如下
    std::string tree2CSS(XMLNode & rootNode, unsigned depth = 0)
    {
        int i = 1;
        XMLNode childNode = rootNode.getChildNode(i);
        std::string accumCSS;
        while (!childNode.isEmpty())
        {
            std::string tabs(depth, '\t');
            accumCSS.append("\n" + tabs);
            if (depth > 0) accumCSS.append(" > ");
            accumCSS.append((std::string)childNode.getName() + tree2CSS(childNode, depth + 1));
            childNode = rootNode.getChildNode(++i);
        }
        return accumCSS;
    }
    

    问题是,该程序不起作用,我不知道为什么。谁能帮我?

    最佳答案

    您希望为每个元素打印整个血统,因此您必须以某种方式跟踪所有 parent ,而不仅仅是深度。

    我认为最好对循环外的每个元素都进行一次定价,并且循环仅用于拜访 child 。

    这是一个替代的实现:

    std::string tree2CSS_(XMLNode& rootNode, std::vector<std::string>& pred)
    {
        std::string accumCSS(pred.size(), '\t');
        std::string name = rootNode.getName();
    
        for (size_t i = 0; i < pred.size(); ++i) {
            accumCSS += pred[i] + " > ";
        }
        accumCSS += name + "\n";
    
        size_t i = 0;
        XMLNode& childNode = rootNode.getChildNode(i);
    
        pred.push_back(name);
        while (!childNode.isEmpty()) {
            accumCSS.append(tree2CSS_(childNode, pred));
            childNode = rootNode.getChildNode(++i);
        }
        pred.pop_back();
    
        return accumCSS;
    }
    
    std::string tree2CSS(XMLNode& rootNode)
    {
        std::vector<std::string> pred;
        return tree2CSS_(rootNode, pred);
    }
    

    我在这里使用了前面的字符串的 vector ,当然它的大小是递归深度。该实现分为提供函数的前端函数和递归实现。

    此实现打印主体节点,并且还将主体附加到所有CSS声明符。如果要跳过最上面的节点,请在前端功能中循环遍历 body 的 child 。

    09-26 12:54