Разбор XML с использованием libxml2 - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь из почти дня проанализировать приведенный ниже XML с помощью библиотеки libxml2 cpp.Мне нужно 2 вещи:

1) Мне нужно получить список всех тегов "Bucket" в массиве std :: vector.

2) Найти, присутствует ли тег "NextMarker"или нет.

Это 2 возможных XML, которые могут быть заданы в качестве входных данных.

XML 1

<?xml version="1.0" encoding="utf-8"?>  
<EnumerationResults ServiceEndpoint="https://myaccount.blob.core.windows.net/">  
  <MaxResults>3</MaxResults>  
  <Containers>  
    <Bucket>  
      <Name>audio</Name>  
      <Properties>  
        <Last-Modified>Wed, 26 Oct 2016 20:39:39 GMT</Last-Modified>  
        <Etag>0x8CACB9BD7C6B1B2</Etag> 
        <PublicAccess>container</PublicAccess> 
      </Properties>  
    </Bucket>  
    <Bucket>  
      <Name>images</Name>  
      <Properties>  
        <Last-Modified>Wed, 26 Oct 2016 20:39:39 GMT</Last-Modified>  
        <Etag>0x8CACB9BD7C1EEEC</Etag>  
      </Properties>  
    </Bucket>  
    <Bucket>  
      <Name>textfiles</Name>  
      <Properties>  
        <Last-Modified>Wed, 26 Oct 2016 20:39:39 GMT</Last-Modified>  
        <Etag>0x8CACB9BD7BACAC3</Etag>  
      </Properties>  
    </Bucket>  
  </Containers>  
  <NextMarker>video</NextMarker>  
</EnumerationResults>

XML 2

<EnumerationResults>
    <Containers />
    <NextMarkerr>/pdtcava01a/container1</NextMarker>
</EnumerationReslts>

Мой бедный код:

int main(){
    // Read the file
    xmlDocPtr doc; /* the resulting document tree */
    doc = xmlReadFile("/home/cbs/hemant/azure_d_patch/backend_trim/file_xml.xml", NULL, 0);

    // Thing#2. Check if NextMarker tag is present. WORKING
    xmlNode *root = xmlDocGetRootElement(doc);
    xmlNodePtr lastChild = root->last->prev;
    xmlChar *NextMarker = xmlCharStrdup("NextMarker");
    if(!xmlStrcmp(lastChild->name, NextMarker)) {
        cout<<"NextMarker tag present"<<endl;
    }

    // thing#1. Failing to get the list of Buckets. NOT WORKING
    xmlChar *toFind = xmlCharStrdup("Containers");
    xmlNodePtr container = findNodeByName(root->children, toFind);
    container = container->children;

    XmlVal hem(container->children);
    std::vector<XmlVal> cont_list = hem.list(); // list() was my internal function which I now scraped.

    for (std::vector<XmlVal>::iterator it = cont_list.begin(); it != cont_list.end(); ++it) {
        bucket b;
        b.name_ = (*it)["Name"].content();
        b.creation_time_ = (*it)["Last-Modified"].content();
        cout<<b.name_<<"    "<<b.creation_time_<<endl;
        bucket_list.push_back(b);
    }
    return 1;

}
...