读取xml属性';使用xerces的值 我有一个C++程序,它使用XRESE库将数据写入XML文件。有人能帮我使用相同的xerces库解析(读取)xml文件中的属性值吗
我得到了下面的程序,据说是为了达到这个目的:读取xml属性';使用xerces的值 我有一个C++程序,它使用XRESE库将数据写入XML文件。有人能帮我使用相同的xerces库解析(读取)xml文件中的属性值吗,c++,xml,xml-parsing,xerces,C++,Xml,Xml Parsing,Xerces,我得到了下面的程序,据说是为了达到这个目的: #include <xercesc/sax2/SAX2XMLReader.hpp> #include <xercesc/sax2/XMLReaderFactory.hpp> #include <xercesc/sax2/DefaultHandler.hpp> #include <xercesc/util/XMLString.hpp> #include <conio.h> #include &
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/util/XMLString.hpp>
#include <conio.h>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;
class ErnstSax2Handler : public DefaultHandler
{
public:
ErnstSax2Handler(void);
virtual ~ErnstSax2Handler(void);
void startElement(
const XMLCh* const uri,
const XMLCh* const localname,
const XMLCh* const qname,
const Attributes& attrs
);
void endElement(
const XMLCh* const uri,
const XMLCh* const localname,
const XMLCh* const qname
);
void characters(
const XMLCh* const chars,
const XMLSize_t length
);
void fatalError(const SAXParseException&);
protected:
// define variables to save the state
};
void ErnstSax2Handler::startElement(const XMLCh* const uri,
const XMLCh* const localname,
const XMLCh* const qname,
const Attributes& attrs)
{
char* name = XMLString::transcode(localname);
cout<<name;
// ...
XMLString::release(&name);
}
void ErnstSax2Handler::endElement(
const XMLCh* const uri,
const XMLCh* const localname,
const XMLCh* const qname)
{
char* name = XMLString::transcode(localname);
//...
XMLString::release(&name);
}
void ErnstSax2Handler::fatalError(const SAXParseException& exception)
{
char* message = XMLString::transcode(exception.getMessage());
cout << "Fatal Error: " << message
<< " at line: " << exception.getLineNumber()
<< endl;
XMLString::release(&message);
}
void ErnstSax2Handler::characters(
const XMLCh* const chars,
const XMLSize_t length
)
{
// This is called when the parser is reading text.
// You will need to save what state you are in via
// startElement / endElement.
}
int main () {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n";
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
char* xmlFile = "test.xml";
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); // optional
DefaultHandler* defaultHandler = new DefaultHandler();
xercesc::ContentHandler* h = new DefaultHandler();
parser->setContentHandler(h);
parser->setErrorHandler(defaultHandler);
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (const SAXParseException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
//getch();
delete parser;
delete defaultHandler;
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间xercesc;
类ErnstSax2Handler:公共DefaultHandler
{
公众:
ErnstSax2Handler(void);
虚拟~ErnstSax2Handler(void);
空星通讯(
常量XMLCh*常量uri,
常量XMLCh*常量localname,
常量XMLCh*常量qname,
常量属性和属性
);
空位元素(
常量XMLCh*常量uri,
常量XMLCh*常量localname,
常量XMLCh*常量qname
);
空字符(
常量XMLCh*常量字符,
常量XMLSize\u t长度
);
void fatalError(const SAXParseException&);
受保护的:
//定义变量以保存状态
};
void ErnstSax2Handler::startElement(常量XMLCh*常量uri,
常量XMLCh*常量localname,
常量XMLCh*常量qname,
常量属性和属性)
{
char*name=XMLString::transcode(localname);
cout我在使用Xerces Sax解析器时遇到了相同的错误。
我能够通过正确地指定其他依赖项来解决这个问题。
您需要将Xerces(库和头)指定为项目中的附加依赖项。这有望解决此问题
在代码中,您还创建了默认处理程序,即
DefaultHandler* defaultHandler = new DefaultHandler();
xercesc::ContentHandler* h = new DefaultHandler();
相反,您必须创建处理程序的实例,即
DefaultHandler* defaultHandler = new ErnstSax2Handler();
xercesc::ContentHandler* h = new ErnstSax2Handler();
每当解析器遇到开始标记、内容标记或结束标记(或任何其他标记)时,就会创建处理程序的实例并执行处理程序中的函数
有用的链接:可能重复的