2012-11-22 56 views
2

我在我的C++程序中使用了xerces 3。 我想要一个人来指导我如何在sax解析中的开始和结束标记之间提取文本。 例如,假设我们有:如何在sax解析中获取xml标签中的文本

<?xml version="1.0"?> 
<catalog> 
    <book id="123"> 
     <author>Introduction to algorithm </author> 
    </book> 
</catalog> 

如何访问这样的文字:“介绍的算法”

+0

向我们展示你到目前为止(简单,不是一个巨大的程序),它可能是一件简单的添加。 – BoBTFish

+0

我的问题很简单!我想读取xml标签之间的文本 –

+1

如果它非常简单,您可以自己做...我写了一些模糊的想法作为答案,但我无法提供任何示例代码没有启动点(即我不会为你写整个程序)。 – BoBTFish

回答

1

如果我没记错,你写你自己的处理程序从HandlerBase继承。 startElement()将被称为<author>,然后endElement()将被称为</author>。在之间的所有文本将被传递到characters(),所以你需要知道什么时候你都在里面<author></author>,并利用这点来的字符到有用的地方保存characters()函数中:http://xerces.apache.org/xerces-c/apiDocs-3/classHandlerBase.html

当我做这个(些时间前)我只是作弊,并将所有内容都作为属性传递给startElement(),并节省了很多麻烦。

编辑:我做了我自己的例子,并有同样的问题(你没有在问题中描述得很好,顺便说一句,如果你提供了你的代码,会更容易解决)。 看那documentation(注意我不小心检查哪个版本,但仍然):

virtual void characters (const XMLCh *const chars, const XMLSize_t length) 

然后检查实际的头文件。

virtual void characters 
(
    const XMLCh* const chars 
    , const unsigned int length 
); 

发现差异?使你自己的版本的签名匹配头文件,它会工作。

+0

是的,这是正确的,我们应该使用characters()方法!但我的字符方法永远不会被解析 –

+0

我应该注册一些关于它? –

+0

@paradisalprogrammer不知道你是否仍然在这里,但我把我自己的例子放在一起,并找出为什么我的'characters()'函数没有被调用。现在添加更新到我的答案。 – BoBTFish

1

您应该能够使用:

void HandlerBase::characters ( const XMLCh *const  chars, 
    const XMLSize_t  length 
) 

要知道,这可称为多次。

+0

这个问题并不十分清楚,但我认为(s?)他尝试过,而且从未被调用过。这也是我发生的事情,直到我意识到文档中的签名与标题中的签名不完全相同,所以我没有重写默认(空)实现。 – BoBTFish

+1

C++ 11现在包含了override关键字,使用它可以为您节省不会覆盖正确函数的痛苦。 – doron

-1

在您的方法中使用override关键字。这可能会帮助你一点点

相关问题