当路径不存在时,Xerces XPath会导致seg错误

时间:2015-10-14 16:09:19

标签: c++ xml xpath xerces

我可以使用Xerces XPath功能成功地使用以下XML和C ++代码从XML查询信息。

XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <ApplicationSettings>
        hello universe
    </ApplicationSettings>
</root>

C ++

int main()
{
  XMLPlatformUtils::Initialize();
  // create the DOM parser
  XercesDOMParser *parser = new XercesDOMParser;
  parser->setValidationScheme(XercesDOMParser::Val_Never);
  parser->parse("fake_cmf.xml");
  // get the DOM representation
  DOMDocument *doc = parser->getDocument();
  // get the root element
  DOMElement* root = doc->getDocumentElement();

  // evaluate the xpath
  DOMXPathResult* result=doc->evaluate(
      XMLString::transcode("/root/ApplicationSettings"), // <-- HERE IS THE XPATH
      root,
      NULL,
      DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, //DOMXPathResult::ANY_UNORDERED_NODE_TYPE, //DOMXPathResult::STRING_TYPE,
      NULL);

  // look into the xpart evaluate result
  result->snapshotItem(0);
  std::cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<std::endl;;

  XMLPlatformUtils::Terminate();
 return 0;
}

问题是有时我的XML只会有某些字段。但是,如果我从XML中删除ApplicationSettings条目,它将会出错。如何正确处理这些可选字段?我知道尝试从seg故障中纠正是有风险的业务。

1 个答案:

答案 0 :(得分:1)

此行发生了seg故障

 std::cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<std::endl;

专门针对getFirstChild()来电,因为getNodeValue()的结果是NULL

这是我快速而肮脏的解决方案。它不是很理想但它有效。我希望得到更复杂的评估和回应。

if (result->getNodeValue() == NULL)
{
  cout << "There is no result for the provided XPath " << endl;
}
else
{
  cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl;
}