gpt4 book ai didi

c++ - 如何反转 xml 树中的遍历节点,特别是 libxml/c++

转载 作者:行者123 更新时间:2023-11-28 08:14:49 24 4
gpt4 key购买 nike

我大约一周前问过这个问题,虽然我得到了一个回复,但我从未更新过它;我一开始也解释得很糟糕。所以,又来了。

<elementA>text</elementA>
<elementF>text</elementF>
<elementE>text</elementE>
<elementD>text</elementD> <-- This gets missed
<elementC>text</elementC>
<elementB>text</elementB>
<elementA>text</elementA> <-- xmlNodePtr node
<elementA>text</elementA>
<elementA>text</elementA>
<elementA>text</elementA>
<elementA>text</elementA>

鉴于上述情况,我将如何向后走并击中每个节点?向前走我会使用这个功能(还没有测试过)。也许是个愚蠢的问题,但在我看来,如果我简单地反转它,它就会跳过上面的内容,不是吗?我觉得我错过了一些明显的东西。

htmlNodePtr find_element_by_tag(htmlNodePtr startNode, string tagname)
{
// Loop through all nodes
for (htmlNodePtr node = startNode; node != NULL; node = node->next)
{
// Only

interested in Element nodes
if(node->type == XML_ELEMENT_NODE)
{
// Compare to search tagname
if(xmlStrcasecmp(node->name, (const xmlChar*)tagname.c_str()) == 0)
{
// If found return node pointer
return node;
}
// Recursively depth walk children nodes as well
if(node->children != NULL)
{
this->find_element_by_tag(node->children);
}
}
}

// If not found return NULL pointer
return NULL;
}

最佳答案

起初我没有正确地阅读你的问题,所以我的第一个答案是错误的。我认为这可行(伪 C++):

nodePtr reverse_find(nodePtr start, string tag)
{
// check current node and previous siblings
for (node = start; node != NULL; node = node->prev)
{
if (tag == node->name) { return node; }
result = find_element_by_tag(node, tag);
if (result) { return result; }
}

// not found, start looking at the parent nodes
if (node->parent)
{
if (tag == node->parent->name) { return node->parent; }

if (node->parent->prev)
{
if (tag == node->parent->prev->name) { return node->parent->prev; }

result = reverse_find(node->parent->prev, tag);
if (result) { return result; }
}
}
return NULL;
}

关于c++ - 如何反转 xml 树中的遍历节点,特别是 libxml/c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8018311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com