Ask Your Question
0

Geeting error while reading the xml file.

asked 2018-02-16 03:26:51 -0500

vps gravatar image

updated 2018-02-16 10:34:23 -0500

Hi , I am getting the error while reading the xml file. The error message is.."duplicate key". I have attached read and write function and screenshot of xml file. thank you.

xml data:

<?xml version="1.0"?>

   -<opencv_storage>


           -<features>

          <SuperPixelno>0</SuperPixelno>

          <lValue>2.9496402877697842e-01</lValue>

          <aValue>1.2799040767386091e+02</aValue>

          <bValue>1.2798081534772182e+02</bValue>

          <xCenter>1.1899280575539569e+01</xCenter>

          <yCenter>1.5884892086330936e+01</yCenter>

         <depthValue>-1.</depthValue>

          </features>


       -<features>

         <SuperPixelno>1</SuperPixelno>

           <lValue>1.6258596973865200e+00</lValue>

         <aValue>1.2793397524071527e+02</aValue>

         <bValue>1.2792159559834938e+02</bValue>

        <xCenter>9.6396148555708390e+00</xCenter>

        <yCenter>5.1880330123796426e+01</yCenter>

       <depthValue>-1.</depthValue>

      </features>

...........................so on.....................

link text ...........................................................................................................................................

int main()
{
std::vector<std::string> names = { "SuperPixelno", "lValue", "aValue","bValue","xCenter","yCenter","depthValue" };
cv::FileStorage fs("FeatureVector.xml", cv::FileStorage::WRITE);
superpixelSlic.writeVector(fs, names, tempCenters);
fs.release();

vector<CenterValues> readTempCenters;
std::vector<std::string> nm = { "SuperPixelno", "lValue", "aValue","bValue","xCenter","yCenter","depthValue" };
FileStorage fs2("FeatureVector.xml", FileStorage::READ);
readVector(fs2, nm, readTempCenters);
fs2.release();

return (0);
}

void readVector(FileStorage &fns, vector<std::string> nm, vector<CenterValues> &data)
{
    data.clear();

    CenterValues tmp;
    FileNode fn = fns["features"];

    if (fn.empty()) {
        return;
    }

    for (FileNodeIterator current = fn.begin(); current != fn.end(); ++current)
    {
        //FileNode item = *current;


        cout << "superpixelno. " << (double)(*current)[nm[0]];
        cout << "light Value " << (double)(*current)[nm[1]];
        cout << "a value" << (double)(*current)[nm[2]];
        cout << "b value" << (double)(*current)[nm[3]];
        cout << "x Value" << (double)(*current)[nm[4]];
        cout << "y Value" << (double)(*current)[nm[5]];
        cout << "depth Value" << (double)(*current)[nm[6]];

    }

}

void SuperpixelSlic:: writeVector(cv::FileStorage &fs, std::vector<std::string> &names, std::vector<CenterValues> &data)
{

    for (int i = 0; i < data.size(); i++)![image description](/upfiles/1518773204719258.png)
    {
        fs << "features";
        fs <<"{:"<< names[0] << i<<names[1] << data[i].lightValue <<names[2] << data[i].aValue<<names[3] << data[i].bValue << names[4] << data[i].xValue<<names[5] << data[i].yValue<<names[6] << data[i].depthValue<<"}";
    }
}
edit retag flag offensive close merge delete

Comments

1

please be so kind, and replace the xml screenshot with a text version, thank you !

berak gravatar imageberak ( 2018-02-16 03:32:25 -0500 )edit

Hi berak, I tried to post data but only integers are present. Can you please tell me that how to attach text file here? thank you.

vps gravatar imagevps ( 2018-02-16 03:40:58 -0500 )edit

copy/paste it into your question, mark it with the mouse, hit the "10101" button to format it.

berak gravatar imageberak ( 2018-02-16 03:42:36 -0500 )edit
1

"duplicate key" = <features> xml browser cannot make a difference between first feature and second and...

LBerger gravatar imageLBerger ( 2018-02-16 03:47:14 -0500 )edit

Hi Berak, I have added the dropbox link to access the xml file. thnak you.

vps gravatar imagevps ( 2018-02-16 03:51:05 -0500 )edit

nice try, but that file is broken (invalid xml).

next attempt , please, and put it HERE, not on dropbox.

berak gravatar imageberak ( 2018-02-16 03:53:25 -0500 )edit

Hi Break..done :(

vps gravatar imagevps ( 2018-02-16 03:58:23 -0500 )edit

1 answer

Sort by ยป oldest newest most voted
1

answered 2018-02-16 10:44:54 -0500

berak gravatar image

you should be able to keep your reading code, if you change the writing code to:

void writeVector(cv::FileStorage &fs, std::vector<std::string> &names, std::vector<CenterValues> &data)
{

    fs << "features" << "[";
    for (int i = 0; i < data.size(); i++)
    {
        fs <<"{:"<< names[0] << i<<names[1] << data[i].lightValue <<names[2] << data[i].aValue<<names[3] << data[i].bValue << names[4] << data[i].xValue<<names[5] << data[i].yValue<<names[6] << data[i].depthValue<<"}";
    }
    fs << "]";
}

this will write xml similar to:

<?xml version="1.0"?>
<opencv_storage>
<features>
  <_><SuperPixelno>0</SuperPixelno>
    <lValue>1.</lValue>
    <aValue>2.</aValue>
    <bValue>3.</bValue>
    <xCenter>4.</xCenter>
    <yCenter>5.</yCenter>
    <depthValue>0.</depthValue></_>
  <_><SuperPixelno>1</SuperPixelno>
    <lValue>5.</lValue>
    <aValue>6.</aValue>
    <bValue>7.</bValue>
    <xCenter>8.</xCenter>
    <yCenter>9.</yCenter>
    <depthValue>0.</depthValue></_>
 ...
edit flag offensive delete link more

Comments

Thanks a lot Berak. It is working now.

vps gravatar imagevps ( 2018-02-16 10:50:03 -0500 )edit

Question Tools

1 follower

Stats

Asked: 2018-02-16 03:26:51 -0500

Seen: 180 times

Last updated: Feb 16 '18