我正在使用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?我是否需要遍历文档树并释放所有内存?
注意:这个问题只与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'?
我的预感是它是不可能的,但是在我看来,拥有一个通用功能模板的概念足够有用,可以有一种替代方法来接近我正在寻找的功能......
如果任何术语不正确或解释不清楚,请道歉.我已经围绕这个主题做了很多研究(为了达到在同一名称空间内工作的函数模板专业化),但还没有找到明确的答案.
我认为问题是使用函数或其他错误.
这部分代码正在运行,但结果并不好.
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)
找不到工作实例.
在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) 有人可以给我一些有关如何将 TinyXML(或 TinyXML++)安装到 debian 的说明,以便我可以在我的 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.所以我做了这个:
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) 为什么这个循环只运行一次?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) 例如:
的test.xml
<fruit taste="good">whatever</fruit>
Run Code Online (Sandbox Code Playgroud)
如何使用TinyXML获取标签"fruit"的名称字符串(当然是"水果")?
这个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++ ×10
tinyxml ×10
xml ×2
googletest ×1
templates ×1
tinyxml2 ×1
while-loop ×1
whitespace ×1
xml-parsing ×1