c++实现xml解析器树状打印
时间: 2023-08-15 19:07:09 浏览: 126
c++实现的简单xml解析器
4星 · 用户满意度95%
实现一个简单的XML解析器,可以使用C++的标准库中的SAX解析器,例如Xerces-C++库。以下是一个使用Xerces-C++的示例代码,可以将XML文件解析成树状结构并打印出来。
```c++
#include <iostream>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>
using namespace std;
using namespace xercesc;
class MySAXHandler : public HandlerBase
{
public:
void startElement(const XMLCh* const name, AttributeList& attributes)
{
cout << "<" << XMLString::transcode(name) << ">" << endl;
for (int i = 0; i < attributes.getLength(); i++)
{
cout << " " << XMLString::transcode(attributes.getName(i)) << "=\"" << XMLString::transcode(attributes.getValue(i)) << "\"" << endl;
}
}
void endElement(const XMLCh* const name)
{
cout << "</" << XMLString::transcode(name) << ">" << endl;
}
void characters(const XMLCh* const chars, const XMLSize_t length)
{
cout << " " << XMLString::transcode(chars) << endl;
}
};
int main()
{
try
{
SAXParser parser;
MySAXHandler handler;
parser.setContentHandler(&handler);
parser.parse("example.xml");
}
catch (const XMLException& e)
{
cerr << "Error: " << XMLString::transcode(e.getMessage()) << endl;
return 1;
}
catch (const SAXParseException& e)
{
cerr << "Error: " << XMLString::transcode(e.getMessage()) << endl;
return 1;
}
catch (...)
{
cerr << "Unknown error occurred." << endl;
return 1;
}
return 0;
}
```
上述代码中,`MySAXHandler` 类继承自 `HandlerBase` 类,它是一个SAX事件处理器,用于处理XML文档中的元素和字符数据。`startElement` 方法处理元素的开始标签,`endElement` 方法处理元素的结束标签,`characters` 方法处理元素内的字符数据。在这些方法中,我们可以将XML文档解析成树状结构,并打印出来。
阅读全文