我正在为我的应用程序使用TinyXml库,但TiXmlDocument对象只能加载Xml文件.如何从字符串加载Xml.你能告诉我这样做的方法吗?非常感谢你
涂.
我正在尝试使用TinyXML从内存中读取和保存,而不是仅将文件读取并保存到磁盘.
似乎documnent的解析函数可以加载char*.但是当我完成它时,我需要将文档保存到char*.有谁知道这个?
编辑:打印和流媒体功能不是我想要的.它们以可视格式输出,我需要实际的xml内容.
编辑:打印很酷.
我正在使用TinyXML来解析/构建XML文件.现在,根据文档,该库通过UTF-8支持多字节字符集.到目前为止,我认为这么好.但是,库提供的唯一API(用于获取/设置元素名称,属性名称和值,...使用字符串的所有内容)是通过std::string或const char*.这让我怀疑自己对多字节字符集支持的理解.如何只支持8位字符的字符串包含16位字符(除非它使用代码页,这将否定'支持Unicode'声明)?我理解你理论上可以采用一个16位的代码点并将其分成2个字符std::string,但这不会改变std::string 对于'Unicode'字符串,它会使其在大多数情况下无效,并且在写入文件并由另一个程序读入时可能会意外地工作.
那么,有人可以向我解释一个库如何提供一个'8位接口'(std::string或const char*)并仍然支持'Unicode'字符串?
(我可能在这里混淆了一些Unicode术语;对于任何来自此的混淆感到抱歉).
我有一堆存储在XML文件中的分层数据.我正在使用TinyXML将其包装在手工制作的类之后.给定一个XML片段,将源签名描述为一组(频率,级别)对,如下所示:
<source>
<sig><freq>1000</freq><level>100</level><sig>
<sig><freq>1200</freq><level>110</level><sig>
</source>
Run Code Online (Sandbox Code Playgroud)
我用这个提取对:
std::vector< std::pair<double, double> > signature() const
{
std::vector< std::pair<double, double> > sig;
for (const TiXmlElement* sig_el = node()->FirstChildElement ("sig");
sig_el;
sig_el = sig_el->NextSiblingElement("sig"))
{
const double level = boost::lexical_cast<double> (sig_el->FirstChildElement("level")->GetText());
const double freq = boost::lexical_cast<double> (sig_el->FirstChildElement("freq")->GetText());
sig.push_back (std::make_pair (freq, level));
}
return sig;
}
Run Code Online (Sandbox Code Playgroud)
其中node()指向<source>节点.
问题:我是否会使用XPath库来获得更整洁,更优雅,更易于维护或更好的代码?
更新:我已经尝试过两种方式使用TinyXPath.它们都没有实际工作,这显然是对他们的一个重点.我做了一些根本错误的事吗?如果这是XPath的样子,我认为这对我没有任何帮助.
std::vector< std::pair<double, double> > signature2() const
{
std::vector< std::pair<double, double> > sig;
TinyXPath::xpath_processor source_proc (node(), "sig");
const unsigned n_nodes = source_proc.u_compute_xpath_node_set();
for (unsigned i = …Run Code Online (Sandbox Code Playgroud) 我正在使用tinyxml库来解析项目中的XML文件.当我尝试定位x64平台时,我得到了LINKER错误,这里有一个错误:
错误4错误LNK2001:未解析的外部符号"private:static struct TiXmlString :: Rep TiXmlString :: nullrep_"(?nullrep_ @ TiXmlString @@ 0URep @ 1 @ A)ClassThatUsesTinyXML.obj
更新:我认为没有安装x64版本的tinyxml,但是当我尝试为x64平台构建库时,我遇到了这个错误:
LNK1561: entry point must be defined
Run Code Online (Sandbox Code Playgroud) 我想从TinyXml输出中解析一组元素.本质上,我需要选择端口的任何端口元素"portid"属性的状态"open"(如下面的端口23所示).
最好的方法是什么?这是TinyXml输出的(简化)列表:
<?xml version="1.0" ?>
<nmaprun>
<host>
<ports>
<port protocol="tcp" portid="22">
<state state="filtered"/>
</port>
<port protocol="tcp" portid="23">
<state state="open "/>
</port>
<port protocol="tcp" portid="24">
<state state="filtered" />
</port>
<port protocol="tcp" portid="25">
<state state="filtered" />
</port>
<port protocol="tcp" portid="80">
<state state="filtered" />
</port>
</ports>
</host>
</nmaprun>
Run Code Online (Sandbox Code Playgroud) 简短的问题:有关pugixml和tinyxml比较的任何意见吗?
细节我需要使用XML解析器/编写器.我的软件是用C++编写的.
在我看来,TinyXML和pugixml都是不错的选择(RapidXML也很好,但它的界面似乎并不像上面那样容易,因为我必须自己管理数据分配).
人们对两者之间的比较有何评论?我正在开发一个嵌入式平台,因此内存处理对我很重要,我需要能够解析和编写XML数据.
速度并不重要,但内存使用和界面更容易.
谢谢.PS我正在处理的XML文件相当小(最大大小= 1200字节;最大元素= 6或7; XML文件相当简单).
更新:仍然无法正常工作:(我已更新代码部分以反映我目前拥有的内容.
对于使用过TinyXML的人来说,这应该是一个非常简单的问题.我正在尝试使用TinyXML来解析XML文档并提取一些值.我想出了昨天如何在库中添加,我已经成功加载了文档(嘿,这是一个开始).
我一直在阅读手册,我无法弄清楚如何提取个人属性.谷歌搜索后,我还没有找到我的具体例子的例子,所以也许这里使用过TinyXML的人可以提供帮助.下面是XML的一部分,我已经开始解析它了.
XML:
<EGCs xmlns="http://tempuri.org/XMLSchema.xsd">
<card type="EGC1">
<offsets>
[ ... ]
</offsets>
</card>
<card type="EGC2">
<offsets>
[ ... ]
</offsets>
</card>
</EGCs>
Run Code Online (Sandbox Code Playgroud)
加载/解析代码:
TiXmlDocument doc("EGC_Cards.xml");
if(doc.LoadFile())
{
TiXmlHandle hDoc(&doc);
TiXmlElement* pElem;
TiXmlHandle hRoot(0);
pElem = hDoc.FirstChildElement().Element();
if (!pElem) return false;
hRoot = TiXmlHandle(pElem);
//const char *attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");
pElem = hDoc.FirstChild("EGCs").Child("card", 1).ToElement();
if(pElem)
{
const char* tmp = pElem->GetText();
CComboBox *combo = (CComboBox*)GetDlgItem(IDC_EGC_CARD_TYPE);
combo->AddString(tmp);
}
}
Run Code Online (Sandbox Code Playgroud)
我想拉出每张卡片"type"并将其保存为字符串以放入组合框中.如何访问此属性成员?
我正在使用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?我是否需要遍历文档树并释放所有内存?
我有一个使用 boost::read_until 和 boost::streambuf 的客户端/服务器应用程序。我正在从套接字读取 XML 消息,并希望使用 tinyXML2 来解析它,如下所示:
XMLDocument doc;
doc.parse(strPtr); // strPtr is const char*
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式从streambuf中提取const char *strPtr。到目前为止,我在堆栈交换上找到了三种方法:
// method 1, string constructor
const char * streambufToPtr(boost::asio::streambuf &message) {
boost::asio::streambuf::const_buffers_type bufs = message.data();
std::string astr(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + message.size());
return astr.c_str();
}
// method 2, stringstream
const char * streambufToPtr(boost::asio::streambuf &message) {
std::ostringstream ss;
ss << &message;
std::string astr = ss.str();
return astr.c_str();
}
// method 3, buffer_cast
const char * streambufToPtr(boost::asio::streambuf &message) {
const char* bufPtr=boost::asio::buffer_cast<const char*>(message.data());
return …Run Code Online (Sandbox Code Playgroud)