2016-02-28 69 views
0

我有一個任務要完成,直到星期一,但我被困在一個點。讓我解釋一下C XML解析操作

static void print_element_names(xmlNode *a_node){ 
    xmlNode *cur_node = NULL; 
    xmlNode *cur_attr = NULL; 
    for (cur_node = a_node; cur_node; cur_node = cur_node->next) { 
    if (cur_node->type == XML_ELEMENT_NODE) { 
     // printf("Node Type: Element, name: %s \n Its children's type is: %d \n Its children's content is: %s \n", cur_node->name, cur_node->children->type, cur_node->children->content); 

     printf("Node Name : %-20s", cur_node->name); 
     if(cur_node->properties != NULL){ 
     for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) { 
       printf(" -> with attribute : %s\n", cur_attr->name); 
     } 
    } 
     printf("Content %s\n", cur_node->children->content); 
    } 
    print_element_names(cur_node->children); 
    } 
    } 

這是我編寫XML的代碼,但是我寫不出節點的屬性。

ERROR

**project1.c: In function ‘print_element_names’: 
project1.c:23:23: warning: assignment from incompatible pointer type [enabled by default] 
     for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) { 

這是我的XML

<Xset> 
<xdata>January</xdata> 
<xdata>February</xdata> 
<xdata>March</xdata> 
<xdata>April</xdata> 
<xdata>May</xdata> 
<xdata>June</xdata> 
</Xset> 
<Yset unit="TL" name="İzmir" showvalue="yes" fillcolor="FFCCDD"> 
<ydata>1200</ydata> 
<ydata>1500</ydata> 
<ydata>7500</ydata> 
<ydata>4200</ydata> 
<ydata>5600</ydata> 
<ydata>2200</ydata> 
</Yset> 
+0

你的 「錯誤」不是一個錯誤,而是一個警告。正如消息所示,您必須爲'cur_attr'使用適當的類型。 – MikeCAT

+1

我不知道如何聲明變量。在C編碼和代碼的新的不編譯。我不得不改變什麼,但什麼 – Berkin

+1

我不知道,因爲我不知道你使用的庫,但'cur_attr'的類型應該是'cur_node->屬性'的類型,猜測'xmlAttr *'或者什麼。 – MikeCAT

回答

1

謝謝大家,我解決了這個問題:)

static void xmlWalk(xmlNode *a_node){ 
    xmlNode *cur_node = NULL; //nodes 
    xmlAttr *cur_attr = NULL; //node's attributes 
    xmlChar *attribute;  //attribute values 
    for (cur_node = a_node; cur_node; cur_node = cur_node->next) { //look all nodes 
     if (cur_node->type == XML_ELEMENT_NODE) {  
     printf("Node Name : %-20s", cur_node->name); //print node name 
     if(cur_node->properties != NULL){ //if node has attribute 
      for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) { //search all attributes 
      printf("with attribute : %s", cur_attr->name); //print attribute tag 
      attribute = xmlNodeGetContent((xmlNode*)cur_attr); //value is a char/char array 

      printf("-> with Value: %s", attribute); //print value 
      } 
     } 
     printf("Content %s\n", cur_node->children->content); //node's child's content 
     } 
     xmlWalk(cur_node->children); //search node's children 
    } 
    } 

解決:)