Я пытаюсь из почти дня проанализировать приведенный ниже 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;
}