Синтез кода - C ++ / Сериализация подузлов дерева - PullRequest
6 голосов
/ 30 апреля 2011

Я использую этот замечательный инструмент (http://www.codesynthesis.com/products/xsd/c++/tree/) для преобразования xsd в код на c ++.

Я пытаюсь получить строку xml из подузла, но единственное, что я могу получить, этовсе XML, как это:

все XML:

<?xml version="1.0"?>
<people ....>

  <person id="1">
    <first-name>John</first-name>
    <address>
      ....
    </address>
  </person>
...

Я могу получить все XML, делая что-то вроде этого:

people_t& p = ...
xml_schema::namespace_infomap map;
map[""].schema = "people.xsd";

// Serialize to a string.
//
std::ostringstream oss;
people (oss, p, map);
std::string xml (oss.str ());

Но что я хочунапример, получить только подузел

xml. Это можно сделать? как это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 июня 2012

Да, это возможно.Если вы хотите иметь возможность сериализовать только элемент адреса, вам необходимо передать параметр --root-element команде CodeSynthesis XSD.В Ubuntu вы написали бы

xsdcxx cxx-tree --root-element address --generate-serialization people.xsd

Если вам, с другой стороны, нужно просто указать значение адреса, вы можете вообще пропустить сериализацию и просто использовать сгенерированную функцию get address()

0 голосов
/ 07 июля 2011

Если я понимаю, что вы спрашиваете, я думаю, что вы хотите использовать флаг no_xml_declaration.

people (oss, p, map, "UTF-8",
        xml_schema::flags::no_xml_declaration);

Это подавляет декларацию XML, хотя для некоторых версий Xerces-C это приводит к ложной новой строке в начале, которую вам нужно удалить. http://www.codesynthesis.com/pipermail/xsd-users/2009-December/002625.html

Для тех, кто позже обратится к этому вопросу, вам также необходимо вызвать xsdcxx с параметром --generate-serialization. По умолчанию генерируются только методы разбора.

xsdcxx cxx-tree --generate-serialization {source XSD files}
...