从字符串创建一个新节点及其子节点
Create a new node and its child nodes from a string
我试过函数 xmlNewDocNode
和 xmlNewDocRawNode
,但它们都 XML - 转义我们作为参数传递给它们的内容字符串。因此,显然他们都只能创建单个节点而不是子树。是否有允许我们创建子树的函数?例如,如果我们将字符串 <foo><bar>baz</bar></foo>
传递给函数,它将创建一个子树:
foo: xmlNode
`- bar: xmlNode
`- baz: plaintext
而不是
foo: xmlNode
`- <bar>baz</bar>: plaintext
重新编辑:
可以将文本解析成一个临时文档节点,然后找到我们想要的节点并从文档中分离出来。这种从文本创建新节点的方式似乎有点矫枉过正。我想知道是否有一个 libxml2 函数可以为我们做这件事。
有xmlParseBalancedChunkMemory。它的行为稍微更通用一些,因为它可以解析一系列节点。但这很容易检查,如以下 C 示例所示:
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int
main(int argc, char **argv)
{
xmlDoc *doc = NULL;
xmlNodePtr nodes = NULL;
xmlChar *string = "<foo><bar>baz</bar></foo><blah/>";
int stat = xmlParseBalancedChunkMemory(NULL, NULL, NULL, 0, string, &nodes );
printf("stat:%d\n", stat);
if (stat == 0) {
printf("first:%s\n", nodes->name);
printf("first-child:%s\n", nodes->children->name);
printf("next:%s\n", nodes->next->name);
}
if (nodes != NULL) xmlFreeNodeList(nodes);
}
输出:
stat:0
first:foo
first-child:bar
next:blah
我试过函数 xmlNewDocNode
和 xmlNewDocRawNode
,但它们都 XML - 转义我们作为参数传递给它们的内容字符串。因此,显然他们都只能创建单个节点而不是子树。是否有允许我们创建子树的函数?例如,如果我们将字符串 <foo><bar>baz</bar></foo>
传递给函数,它将创建一个子树:
foo: xmlNode
`- bar: xmlNode
`- baz: plaintext
而不是
foo: xmlNode
`- <bar>baz</bar>: plaintext
重新编辑: 可以将文本解析成一个临时文档节点,然后找到我们想要的节点并从文档中分离出来。这种从文本创建新节点的方式似乎有点矫枉过正。我想知道是否有一个 libxml2 函数可以为我们做这件事。
有xmlParseBalancedChunkMemory。它的行为稍微更通用一些,因为它可以解析一系列节点。但这很容易检查,如以下 C 示例所示:
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int
main(int argc, char **argv)
{
xmlDoc *doc = NULL;
xmlNodePtr nodes = NULL;
xmlChar *string = "<foo><bar>baz</bar></foo><blah/>";
int stat = xmlParseBalancedChunkMemory(NULL, NULL, NULL, 0, string, &nodes );
printf("stat:%d\n", stat);
if (stat == 0) {
printf("first:%s\n", nodes->name);
printf("first-child:%s\n", nodes->children->name);
printf("next:%s\n", nodes->next->name);
}
if (nodes != NULL) xmlFreeNodeList(nodes);
}
输出:
stat:0
first:foo
first-child:bar
next:blah