Tôi đang dán một số mã ở đây để biên dịch không có cảnh báo bằng cách sử dụng tệp gcc.c -lxml2, giả sử rằng libxml2 được cài đặt trong hệ thống của bạn.lỗi libxml2 với không gian tên và xpath
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <assert.h>
#include <libxml/tree.h>
#include <libxml/xpathInternals.h>
xmlDocPtr
getdoc (char *docname) {
xmlDocPtr doc;
doc = xmlParseFile(docname);
if (doc == NULL) {
fprintf(stderr,"Document not parsed successfully. \n");
return NULL;
}
return doc;
}
xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
return NULL;
}
if(xmlXPathRegisterNs(context, BAD_CAST "new", BAD_CAST "http://www.example.com/new") != 0) {
fprintf(stderr,"Error: unable to register NS with prefix");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (result == NULL) {
printf("Error in xmlXPathEvalExpression\n");
return NULL;
}
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
}
return result;
}
int
main(int argc, char **argv) {
char *docname;
xmlDocPtr doc;
xmlChar *xpath = (xmlChar*) "/new:book/section1";
xmlNodeSetPtr nodeset;
xmlXPathObjectPtr result;
int i;
xmlChar *keyword;
if (argc <= 1) {
printf("Usage: %s docname\n", argv[0]);
return(0);
}
docname = argv[1];
doc = getdoc(docname);
result = getnodeset (doc, xpath);
if (result) {
nodeset = result->nodesetval;
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
printf("keyword: %s\n", keyword);
xmlFree(keyword);
}
xmlXPathFreeObject (result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
return (1);
}
Vấn đề của tôi là tôi muốn phân tích cú pháp xml sau
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://www.example.com/new">
<section1>Sec_1</section1>
<section2>Sec_2</section2>
</book>
yếu tố cuốn sách định nghĩa một namespace bên trong phần tử đó. Tôi muốn in giá trị trong xpath/book/section1 và nó trả về NULL. Khi tôi cố gắng trả về phần tử dưới một vùng tên, tôi cũng gặp lỗi, tức là/new: book/section1
Tôi giả sử rằng mã của tôi không thành công vì tôi không sử dụng đúng các tiền tố không gian tên. Tôi hết thời gian. Bạn có thể giúp?
Có thể nói 'libxml' rằng một số không gian tên là default/tiềm ẩn đối với tất cả các yếu tố trong một tài liệu để tránh lặp lại nó hơn và hơn trong các truy vấn XPath? – SasQ