从空白xml文件中捕获错误

时间:2016-03-03 19:29:10

标签: c++ xml xml-parsing

我正在使用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

的指南

1 个答案:

答案 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
    }
}