我正在使用C ++,我读入并解析XML文件。如果该文件不存在,则会创建该文件,如果该文件确实存在并且数据格式正确,则不会出现错误。我的问题是当我尝试读取一个空白的XML文件(完全空白甚至不是标题)时,我的程序在尝试处理XML文件中的数据时崩溃。我需要能够在发生之前捕获错误,以便我可以将正确的设置转回文件或删除文件并创建一个新文件。有没有办法做到这一点,比如检查节点是否为NULL?我该怎么做?
class XmlDomErrorHandler : public HandlerBase
{
public:
void fatalError(const SAXParseException &exc) {
printf("Fatal parsing error at line %d\n", (int)exc.getLineNumber());
exit(-1);
}
};
void XmlParentNode::refreshAllNodes()
{
m_children.clear();
m_childrernByName.clear();
for(int j =0; j < getInnerParentNode()->getChildNodes()->getLength(); ++j) //crashes here on first pass if xmlfile is empty
{
//code that is never reached
}
XmlDocument::XmlDocument(String name):
XmlParentNode(),
m_pOwner(NULL)
{
if(XmlManager::Get()->initialize())
{
XMLCh* xmlName = XMLString::transcode(StringA(name));
setInnerNode(XmlManager::Get()->getDOMImplementation()->createDocument(NULL, xmlName , NULL));
XMLString::release(&xmlName);
}
}
XmlDocument::XmlDocument(FilePath path):
XmlParentNode(),
m_pOwner(NULL)
{
XMLCh* xmlPath = XMLString::transcode(StringA(path.ToString()));
XercesDOMParser* parser = new XercesDOMParser();
parser->parse(xmlPath);
if(!parser)
{
ErrorHandler* errorHandler = (ErrorHandler*) new XmlDomErrorHandler();
parser->setErrorHandler(errorHandler);
}
DOMDocument* p_Doc= parser->getDocument();
m_pOwner = parser;
XMLString::release(&xmlPath);
if (p_Doc!= NULL)
{
setInnerNode(p_Doc);
refreshAllNodes();
}
}
可悲的是,我无法阻止人们编辑XML文件,因为用户需要访问它才能编辑设置。 我是XML的新手,所以也许我错过了一些简单的东西。 我一直在使用带有DOM的XML解析和我找到here
的指南答案 0 :(得分:0)
我解决了这个问题。 我在崩溃的for循环之前添加了一个检查。
if(getInnerParentNode() && getInnerParentNode()->getChildNodes())
{
for(int j =0; j < getInnerParentNode()->getChildNodes()->getLength(); ++j) //was crashing here on first pass if xmlfile is empty
{
//code that was not being reached
}
}