Pet*_*te 9 c++ xml xpath tinyxml
我有一堆存储在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 = 0; i != n_nodes; ++i)
{
TiXmlNode* s = source_proc.XNp_get_xpath_node (i);
const double level = TinyXPath::xpath_processor(s, "level/text()").d_compute_xpath();
const double freq = TinyXPath::xpath_processor(s, "freq/text()").d_compute_xpath();
sig.push_back (std::make_pair (freq, level));
}
return sig;
}
std::vector< std::pair<double, double> > signature3() const
{
std::vector< std::pair<double, double> > sig;
int i = 1;
while (TiXmlNode* s = TinyXPath::xpath_processor (node(),
("sig[" + boost::lexical_cast<std::string>(i++) + "]/*").c_str()).
XNp_get_xpath_node(0))
{
const double level = TinyXPath::xpath_processor(s, "level/text()").d_compute_xpath();
const double freq = TinyXPath::xpath_processor(s, "freq/text()").d_compute_xpath();
sig.push_back (std::make_pair (freq, level));
}
return sig;
}
Run Code Online (Sandbox Code Playgroud)
作为次要问题,如果是,我应该使用哪个XPath库?
总的来说,我倾向于选择基于XPath的解决方案,因为它们的简洁性和多功能性,但老实说,在你的情况下,我认为使用XPath不会给你带来很多signature.
原因如下:
代码优雅
您的代码很好而且紧凑,使用XPath表达式不会更好.
内存占用情况
除非您的输入XML配置文件很大(一种矛盾)并且DOM解析需要大量的内存占用,因此没有证据表明使用XPath将是一个决定性的解决方案,我会坚持使用DOM.
执行速度
在这样一个简单的XML树上,执行速度应具有可比性.如果存在差异,则可能是TinyXml的优势,因为给定节点下的freq和level标签的搭配.
图书馆和外部参考 这是决定性的一点.X
++中领先的XPath引擎是XQilla.它支持XQuery(因此包括XPath 1.0和2.0)并且由Oracle支持,因为它是由负责Berkeley DB产品的团队开发的(包括使用XQilla的 Berkeley DB XML ).
希望使用XQilla的C++开发人员面临的问题是他们有几种选择
总而言之,在您的情况下,为了它而切换到XPath,如果有的话将带来很少的好处.
然而,XPath是当今开发人员工具箱中非常强大的工具,没有人可以忽略它.如果你只想练习一个简单的例子,你的就像任何一个一样好.然后,我会记住以上几点,无论如何都可能使用TinyXPath.