xml到json转换c ++

时间:2016-03-17 13:25:56

标签: c++ json xml rapidxml rapidjson

我正在开发一个C ++(visual studio 2005)应用,它使用jsonrapidxml库将rapidjson转换为<?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> </catalog> 我。 / p>

XML

{
  "catalog": {
           "book": {
              "-id": "bk101",
              "author": "Gambardella, Matthew",
              "title": "XML Developer's Guide",
              "genre": "Computer",
              "price": "44.95",
              "publish_date": "2000-10-01",
              "description": "An in-depth look at creating applications with XML."
           }
   }
}

Json

{"catalog":{}}

我得到了这个

std::string xml2json(const char *xml_str)
{
std::cout<<xml_str;
rapidxml::xml_document<> *xml_doc = new rapidxml::xml_document<>();
xml_doc->parse<0> (const_cast<char *>(xml_str));

rapidjson::Document js_doc;
js_doc.SetObject();
rapidjson::Document::AllocatorType& allocator = js_doc.GetAllocator();

rapidxml::xml_node<> *xmlnode_chd;

for(xmlnode_chd = xml_doc->first_node()->first_node(); xmlnode_chd; xmlnode_chd = xmlnode_chd->next_sibling())
{
    rapidjson::Value jsvalue_chd;
    jsvalue_chd.SetObject();
    rapidjson::Value jsvalue_name(xmlnode_chd->name(), allocator);
    js_doc.AddMember(jsvalue_name, jsvalue_chd, allocator);
}

delete xml_doc;
rapidjson::StringBuffer buffer;
buffer.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
js_doc.Accept(writer);
return buffer.GetString();
}

如何让我的代码解析XML树中的所有实体。

我认为我的问题来自代码的这一部分:

C ++

{{1}}

1 个答案:

答案 0 :(得分:0)

您遍历根节点的所有兄弟节点,但您永远不会处理他们的孩子。您需要使用遍历树的每个级别的算法。递归的将是传统的选择。