Как писать в разных местах XML-файла одновременно - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу класс C ++, который записывает данные в файл KML на лету.

Проблема в том, что мне нужно написать несколько <Point> элементов внутри <Folder> и одновременно <LineString> элемента создать путь, соединяющий эти точки.

My KML
├── Points
|   ├── Point 1
|   ├── Point 2
|   ├── Point 3
|   └── ...
|
└── Path

Поскольку я должен делать это на лету, мне нужно найти способ записи в разных частях файла KML, чтобы не путать структуру документа XML.

Например, скажем, что у нас есть 2 балла:

  1. Первая запись Точка 1 в файле:
      <Placemark>
        <name>Point 1</name>
        <Point>
          <coordinates>11.807993,48.171485,536.15</coordinates>
        </Point>
      </Placemark>
  1. Затем добавьте его координаты к пути в конце файла:
    <Placemark>
      <name>Path</name>
      <LineString>
        <coordinates>
          11.807993,48.171485,536.15
        </coordinates>
      </LineString>
    </Placemark>
  1. Теперь запишите точку 2:
      <Placemark>
        <name>Point 2</name>
        <Point>
          <coordinates>11.807978,48.171473,538.92</coordinates>
        </Point>
      </Placemark>
  1. и добавить его координаты к пути в конце:
    <Placemark>
      <name>Path</name>
      <LineString>
        <coordinates>
          11.807993,48.171485,536.15
          11.807978,48.171473,538.92
        </coordinates>
      </LineString>
    </Placemark>

И так далее ...

И вот как будет выглядеть итоговый файл KML:

KML in Google Earth

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
  <Document>
    <name>My KML</name>
    <Folder>
      <name>Points</name>
      <Placemark>
        <name>Point 1</name>
        <Point>
          <coordinates>11.807993,48.171485,536.15</coordinates>
        </Point>
      </Placemark>
      <Placemark>
        <name>Point 2</name>
        <Point>
          <coordinates>11.807978,48.171473,538.92</coordinates>
        </Point>
      </Placemark>
    </Folder>
    <Placemark>
      <name>Path</name>
      <LineString>
        <coordinates>
          11.807993,48.171485,536.15
          11.807978,48.171473,538.92
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>

Это просто упрощенный пример. В моем реальном сценарии мне придется делать это с тысячами / миллионами очков. Но концепция та же, что и выше.

Поскольку мой код предназначен для работы на устройствах с очень скудными / ограниченными ресурсами памяти, я не могу позволить себе использовать решения, которые предполагают построение некоторой древовидной структуры в памяти и затем сериализацию ее в XML.

Как мне подойти к этому в C ++?

EDIT:

Отвечая на комментарии о ресурсах, я не могу назвать какие-либо конкретные цифры, но узким местом на целевой машине наверняка станет память, поэтому я не могу позволить себе сохранить все координаты в памяти для последующей печати. Я должен напечатать каждую пару координат одну за другой (в режиме онлайн ), используя то же самое пространство памяти для следующей пары координат, чтобы в любой данный момент в памяти была только одна пара координат.

EDIT:

Полагаю, я могу сделать следующий вывод:

Поскольку запись в разных местах одного и того же файла кажется сложной и подверженной ошибкам [1] , сначала выполняется запись в 2 разных файла, а затем их объединение [2] кажется подходом.

...