现在,我正在尝试创建一个递归函数,该函数采用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)
返回作为子对象XMLNode
的k
对象。如果不存在,则对象返回具有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 。