gpt4 book ai didi

c - 使用 libxml2 在现有 XML 中附加数据

转载 作者:行者123 更新时间:2023-11-30 14:51:32 25 4
gpt4 key购买 nike

嗯,我正在尝试使用 C 编程和 libxml2 模块附加数据,但面临很多问题,因为我对此相当陌生。我的代码设计为首先根据用户输入从 XML 文件中获取一个元素节点,然后获取该子节点的父节点并在其中附加另一个子节点。

XML 文件:

<policyList>
<policySecurity>
<policyName>AutoAdd</policyName>
<deviceName>PA-722</deviceName>
<status>ACTIVE</status>
<srcZone>any</srcZone>
<dstZone>any</dstZone>
<srcAddr>5.5.5.5</srcAddr>
<dstAddr>5.5.5.4</dstAddr>
<srcUser>any</srcUser>
<application>any</application>
<service>htds</service>
<urlCategory>any</urlCategory>
<action>deny</action>
</policySecurity>
<policySecurity>
<policyName>Test-1</policyName>
<deviceName>PA-710</deviceName>
<status>ACTIVE</status>
<srcZone>any</srcZone>
<dstZone>any</dstZone>
<srcAddr>192.168.1.23</srcAddr>
<dstAddr>8.8.8.8</dstAddr>
<srcUser>vivek</srcUser>
<application>any</application>
<service>http</service>
<urlCategory>any</urlCategory>
<action>deny</action>
</policySecurity>
</policyList>

C 代码:

int main(){
xmlDocPtr pDoc = xmlReadFile("/var/www/db/db_policy.xml", NULL, XML_PARSE_NOBLANKS | XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET);
if (pDoc == NULL)
{
fprintf(stderr, "Document not parsed successfully.\n");
return 0;
}

root_element = xmlDocGetRootElement(pDoc);
if (root_element == NULL)
{
fprintf(stderr, "empty document\n");
xmlFreeDoc(pDoc);
return 0;
}

printf("Root Node is %s\n", root_element->name);



xmlChar* srcaddr = "5.5.5.5";
xmlChar *xpath = (xmlChar*) "//srcAddr";
xmlNodeSetPtr nodeset;
xmlXPathObjectPtr result;
int i;
xmlChar *keyword;
xmlXPathContextPtr context;
xmlNodePtr resdev;
xmlChar* resd;
context = xmlXPathNewContext(pDoc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (result == NULL) {
printf("Error in xmlXPathEvalExpression\n");
}
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
};

if (result) {
nodeset = result->nodesetval;
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(pDoc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
printf("keyword: %s\n", keyword);
if(strcmp(keyword, srcaddr) == 0){
xmlNodePtr pNode = xmlNewNode(0, (xmlChar*)"service");
xmlNodeSetContent(pNode, (xmlChar*)"nonser");
xmlAddSibling(result, pNode);
printf("added");
}
xmlFree(keyword);
}
xmlXPathFreeObject (result);
}
xmlFreeDoc(pDoc);
xmlCleanupParser();
return (1);
}

运行此代码时,它会被编译并执行(有一些警告,但不会妨碍执行),但它不会向我的 XML 文件添加任何内容。

最佳答案

我认为这个话题很老了,但我也遇到了类似的问题。所以,我只是分享给那些仍然有类似问题的人。

On running this code, it gets compiled and executed(with a few warnings, but nothing that hinders execution), but it does not add anything to my XML File.

首先:在我看来,C 中的警告比错误更糟糕,因为它会让你运行错误的代码。因此,我的第一个建议是不要忽略这些警告(尽管我无法向任何人提供建议,但无论如何)。

第二:当我运行这段代码时,我看到了一个有意义的警告:

> warning: passing argument 1 of ‘xmlAddSibling’ from incompatible
> pointer type [-Wincompatible-pointer-types]
>
> note: expected ‘xmlNodePtr {aka struct _xmlNode *}’ but argument is of
> type ‘xmlXPathObjectPtr {aka struct _xmlXPathObject *}’

当您检查 http://www.xmlsoft.org/html/libxml-tree.html 中的 xmlAddSibling 时你可以看到:

xmlNodePtr  xmlAddSibling       (xmlNodePtr cur, xmlNodePtr elem)

这意味着两个参数的类型都应该是 xmlNodePtr。但是,“result”的类型为 xmlXPathObjectPtr,这意味着指针类型完全不同。您真正想要做的是将子级添加到您根据比较的字符串找到的父级:(if(strcmp(keyword, srcaddr) == 0))。

所以你寻找 parent 的方式是完全正确的。但有两个问题是:首先,您从未更新过“结果”(如果我们假设您想象“结果”是父级,这是不正确的),因为“nodeset->nodeTab [i]”位于一个永远不会放置任何内容的 for 循环中结果”。第二个问题是,即使您根据“nodeset->nodeTab[i]”更新了“结果”,它们仍然具有不同类型的指针(正如我们之前讨论的)。因此,您必须使用 xmlAddSibling 作为正确的父级并使用正确的指针类型。如下所示,“nodeTab”具有我们正在寻找的“xmlNodePtr”类型,“nodeset->nodeTab[i]”是父级。

Structure xmlNodeSet
struct _xmlNodeSet {
int nodeNr : number of nodes in the set
int nodeMax : size of the array as allocated
> `xmlNodePtr * nodeTab : array of nodes in no particular order`

}

所以你应该改变:

xmlAddSibling(result, pNode);

至:

xmlAddSibling(nodeset->nodeTab[i], pNode);

最后:您没有保存更改。因此,通过添加

来保存它

xmlSaveFileEnc("note.xml", pDoc, "UTF-8");

之前

xmlFreeDoc(pDoc);

通过这些更改,我能够使用您的 XML 文件运行您的代码,并且不会出现任何警告。

关于c - 使用 libxml2 在现有 XML 中附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48224698/

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