【问题标题】:how to read a part of xml file in C++ using Libxml2如何使用 Libxml2 在 C++ 中读取部分 xml 文件
【发布时间】:2014-05-24 12:44:30
【问题描述】:

您好,我需要知道“如何使用 Libxml2 在 C++ 中读取部分 xml 文件”。在我的 xml 文件中,我有:

<svg>
    <g>
       <path d="11"/>
    </g>
</svg>

当我谈到这一点时,我想在我的 c++ 程序上看到“d”的值:

   xmlNode *cur_node = NULL;

    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {

      if(xmlStrEqual(xmlCharStrdup("path"),cur_node->name)){


            printf("element: %s\n", cur_node->name);
        }

        print_element_names(cur_node->children);
    }    
}

我不知道我需要做什么,请帮助我。

【问题讨论】:

  • a_node 指向哪里?你能提供一个独立的例子吗?

标签: c++ xml libxml2


【解决方案1】:

我不确定我是否理解这个问题,但听起来您想在元素“path”中打印 attribute“d”。在上面的代码中,你需要这样的东西:

xmlChar *d = xmlGetProp(cur_node, "d");
... do something ...
xmlFree(d);

【讨论】:

    【解决方案2】:

    类似的东西?

    static void
    print_element_names(xmlNode * a_node)
    
    {
    
       xmlNode *cur_node = NULL;
       xmlChar        *d;
    
       for (cur_node = a_node; cur_node; cur_node = cur_node->next) {    
    
          if(xmlStrEqual(xmlCharStrdup("path"),cur_node->name)){ 
              printf("element: %s\n", cur_node->name);
          }
    
          print_element_names(cur_node->children);  
    
          if(xmlGetProp(cur_node, "d")){  
    
          printf("wspolrzedne: %s\n", d);
       }
    
       xmlFree(d);
    }    
    

    【讨论】:

      【解决方案3】:

      下面的函数将读取带有节点和值的完整xml,

      xmlDocPtr pFilePointer = xmlParseFile(xmlFile);
      xmlNodePtr pNodePointer = xmlDocGetRootElement(pFilePointer);
      
      void readXML(const xmlDocPtr cpFilePointer, const xmlNodePtr cpNodePointer) {
          string value;
          xmlDocPtr pFilePointer = cpFilePointer;
          xmlNodePtr pNodePointer = cpNodePointer;
          while (pNodePointer != NULL) {
              if (NULL != pNodePointer->xmlChildrenNode) {
                  xmlNodePtr pParentPointer = pNodePointer;
                  string node = (const char *)pParentPointer->name;
                  pNodePointer = pNodePointer->xmlChildrenNode;
                  if (!xmlStrcmp(pNodePointer->name, (const xmlChar *)"text")) {
                      xmlNodeListGetStringWrapper(pFilePointer, pNodePointer, value);
                      cout << node << ":" << value << endl;
                  } else {
                      LOG2((TEXT("no need to read node %s\n"), pParentPointer->name));
                  }
              } else if (NULL != pNodePointer->next) {
                  pNodePointer = pNodePointer->next;
              } else {
                  pNodePointer = pNodePointer->parent;
                  pNodePointer = pNodePointer->next;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多