标签: tinyxml

在使用TinyXml for C++时,我需要清理哪些内存管理?

我正在使用TinyXml执行以下操作:

TiXmlDocument doc;
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
TiXmlElement* main = new TiXmlElement("main");

TiXmlElement* header = new TiXmlElement("header");
header->SetAttribute("attribute","somevalue");
main->LinkEndChild(header);

// ... Add many more TiXmlElment* to other elements all within "main" element

doc.LinkEndChild(decl);
doc.LinkEndChild(main);

// ... do stuff with doc

// Now I am done with my doc. What memory management happens here? 
Run Code Online (Sandbox Code Playgroud)

在我的程序执行结束时,是否会在超出范围TiXmlElement*时清理所有内容doc?我是否需要遍历文档树并释放所有内存?

c++ memory-management tinyxml

5
推荐指数
1
解决办法
3980
查看次数

另一个类/命名空间中的函数模板的专业化?

注意:这个问题只与tinyxml松散相关,但是包含这样的细节可能有助于更好地说明这个概念.

我编写了一个函数模板,它将遍历父XML节点子节点,检索子元素的值,然后将该子元素值推送到向量.

'检索值'部分也写为函数模板:

template <typename Type>
Type getXmlCollectionItem(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);
Run Code Online (Sandbox Code Playgroud)

检索部分有专门化,用于返回不同类型的子元素值,例如std :: string和其他自定义对象.

template <>
std::string getXmlCollectionItem<std::string>(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);

template <>
MyObject getXmlCollectionItem<MyObject>(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);
Run Code Online (Sandbox Code Playgroud)

这一切都运行得很好,但是让我感到震惊的是,在处理tinyxml文件时,这对于共享函数库非常有用.

问题:是否可以在一个名称空间中声明一个函数模板,例如namespace UtilityFunctions,它不具有特定对象类型的任何知识'MyObject',然后在具有特定对象类型知识的其他名称空间中声明和定义该函数模板的特化喜欢'MyObject'

我的预感是它是不可能的,但是在我看来,拥有一个通用功能模板的概念足够有用,可以有一种替代方法来接近我正在寻找的功能......

如果任何术语不正确或解释不清楚,请道歉.我已经围绕这个主题做了很多研究(为了达到在同一名称空间内工作的函数模板专业化),但还没有找到明确的答案.

c++ templates tinyxml template-specialization

5
推荐指数
1
解决办法
3139
查看次数

如何计算TinyXml中的元素?

我认为问题是使用函数或其他错误.

这部分代码正在运行,但结果并不好.

TiXmlElement* e = hDoc.FirstChildElement().Element(); // think problem is there
while (e)
{
    e = e->NextSiblingElement();  //or may be there
    count++;
}
Run Code Online (Sandbox Code Playgroud)

计数结果为1.


Xml文件是:

<doc>
   <state> ... </state>
   <state> ... </state>
   ...
</doc>
Run Code Online (Sandbox Code Playgroud)

找不到工作实例.

c++ tinyxml xml-parsing

5
推荐指数
1
解决办法
5817
查看次数

如何在TinyXML2中将XMLElement转换为字符串

在TinyXml 1中,可以使用<<运算符将子元素转换为字符串,例如

TiXmlElement * pxmlChild = pxmlParent->FirstChildElement( "child" );
std::stringstream ss;
ss << (*pxmlChild);
Run Code Online (Sandbox Code Playgroud)

这在TinyXml2中似乎不可能.如何在TinyXml2中将元素转换为xml字符串?

编辑:特别是我在xml之后,例如,如果xml是:

<parent>
    <child>
        <value>abc</value>
    </child>
<parent>
Run Code Online (Sandbox Code Playgroud)

我想要子元素的xml,例如

<child>
    <value>abc</value>
</child>
Run Code Online (Sandbox Code Playgroud)

c++ xml tinyxml tinyxml2

5
推荐指数
2
解决办法
6353
查看次数

TinyXML Debian 安装

有人可以给我一些有关如何将 TinyXML(或 TinyXML++)安装到 debian 的说明,以便我可以在我的 C++ 应用程序中使用它。

我以前从未安装过库,所以我不知道该怎么做。

谢谢

c++ tinyxml

4
推荐指数
1
解决办法
1万
查看次数

与带有C++引号的硬编码字符串进行比较

我正在编写一个c ++函数来使用TinyXML生成XML.我想验证我的函数生成的(相对较小的)树变成了与引用字符串相同的字符串.

// intended XML:
<element type="correct" />
Run Code Online (Sandbox Code Playgroud)

看起来最简单的方法是将引用字符串硬编码到代码中:

//assignment
std::string intended = "<element type=\"correct\" />";
Run Code Online (Sandbox Code Playgroud)

但是,用于避开引号的反斜杠会阻止比较成功.

#include <tinyxml.h>
#include <string.h>
TiXmlElement test = TiXmlElement("element");
test.SetAttribute("type", "correct");
TiXmlPrinter printer;
test.Accept(&printer);
ASSERT_EQ(intended, printer.CStr()); // gtests macro
Run Code Online (Sandbox Code Playgroud)

输出:

Value of: printer.CStr()
Actual: "<element type="correct" />"
Expected: intended
Which is: "<element type=\"correct\" />"
Run Code Online (Sandbox Code Playgroud)

c++ tinyxml googletest

4
推荐指数
1
解决办法
1万
查看次数

使用TinyXML(链接库?在c ++中)

+嗨...我是新手......我不知道如何在c ++中包含外部库.这太难了.

我想使用TinyXML.所以我做了这个:

example2.cpp

#include <iostream>
#include "tinyxml.h"


void write_app_settings_doc( )  
{  
    TiXmlDocument doc;  
    TiXmlElement* msg;
    TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  
    doc.LinkEndChild( decl );  

    TiXmlElement * root = new TiXmlElement( "MyApp" );  
    doc.LinkEndChild( root );  

    TiXmlComment * comment = new TiXmlComment();
    comment->SetValue(" Settings for MyApp " );  
    root->LinkEndChild( comment );  

    TiXmlElement * msgs = new TiXmlElement( "Messages" );  
    root->LinkEndChild( msgs );  

    msg = new TiXmlElement( "Welcome" );  
    msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  
    msgs->LinkEndChild( msg …
Run Code Online (Sandbox Code Playgroud)

c++ tinyxml

3
推荐指数
2
解决办法
2万
查看次数

为什么这个循环只运行一次?

为什么这个循环只运行一次?noteDatabaseItem只接受一个节点并填充数据.xml中有3个音符.

XML:

<?xml version="1.0" encoding="utf-8"?>
<noteCollection>
  <note name="Test Note 1">This is test note 1 content!</note>
  <note name="Test Note 2">This is test note 2 content!</note>
  <note name="Test Note 3">This is test note 3 content!</note>
</noteCollection>
Run Code Online (Sandbox Code Playgroud)

C++:

std::vector<notekeeper::noteDatabaseItem> noteList;
TiXmlElement* noteCollection = xmlDoc->FirstChildElement("noteCollection");
TiXmlElement* node = noteCollection->FirstChildElement("note");
int itemCount = 0;

while (node != NULL) {
    itemCount++;
    noteList.resize(itemCount);
    noteList.push_back(noteDatabaseItem(node));
    node = noteCollection->NextSiblingElement("note");
}
Run Code Online (Sandbox Code Playgroud)

c++ tinyxml while-loop

3
推荐指数
1
解决办法
850
查看次数

如何在TinyXML中获取标签的名称?

例如:

的test.xml

<fruit taste="good">whatever</fruit>
Run Code Online (Sandbox Code Playgroud)

如何使用TinyXML获取标签"fruit"的名称字符串(当然是"水果")?

c++ xml tinyxml

3
推荐指数
1
解决办法
6406
查看次数

不应该从XML中删除多个空格

这个C++代码中有一个错误.它将单词之间的多个空格替换为一个空格.无法弄清楚它在哪里.它不应该修剪两个单词之间的空格并将它们替换为一个空格.这是处理空白和空白的方法.

const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding )
{
    if ( !p || !*p )
    {
        return 0;
    }
    if ( encoding == TIXML_ENCODING_UTF8 )
    {
        while ( *p )
        {
            const unsigned char* pU = (const unsigned char*)p;

            if (    *(pU+0)==TIXML_UTF_LEAD_0
                 && *(pU+1)==TIXML_UTF_LEAD_1 
                 && *(pU+2)==TIXML_UTF_LEAD_2 )
            {
                p += 3;
                continue;
            }
            else if(*(pU+0)==TIXML_UTF_LEAD_0
                 && *(pU+1)==0xbfU
                 && *(pU+2)==0xbeU )
            {
                p += 3;
                continue;
            }
            else if(*(pU+0)==TIXML_UTF_LEAD_0
                 && *(pU+1)==0xbfU
                 && *(pU+2)==0xbfU )
            {
                p += 3;
                continue; …
Run Code Online (Sandbox Code Playgroud)

c++ whitespace tinyxml

3
推荐指数
1
解决办法
1921
查看次数